一個歷史項目,客戶要求改ip,由於系統較為久遠,沒有源代碼,通過反編譯後發現ip寫死在類中,反編譯後的代碼基本沒法進行修改,分析了代碼後,發現與ip相關的內容為返回到頁面中的字符串,所以,想到了使用Filter,在Filter中處理這些字符串,覺得可行,便查詢了一些資料,試驗成功。以下這個類是從網上找到的,試驗成功後發現頁面已經關了,對原作者表示抱歉的同時表示感謝。
package org.mice.ipchange; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.UnsupportedEncodingException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponseWrapper; public class ResponseWrapper extends HttpServletResponseWrapper { private ByteArrayOutputStream buffer = null; private ServletOutputStream out = null; private PrintWriter writer = null; public ResponseWrapper(HttpServletResponse resp) throws IOException { super(resp); buffer = new ByteArrayOutputStream();// 真正存儲數據的流 out = new WapperedOutputStream(buffer); writer = new PrintWriter(new OutputStreamWriter(buffer, this.getCharacterEncoding())); } // 重載父類獲取outputstream的方法 public ServletOutputStream getOutputStream() throws IOException { return out; } // 重載父類獲取writer的方法 public PrintWriter getWriter() throws UnsupportedEncodingException { return writer; } // 重載父類獲取flushBuffer的方法 public void flushBuffer() throws IOException { if (out != null) { out.flush(); } if (writer != null) { writer.flush(); } } public void reset() { buffer.reset(); } public byte[] getResponseData() throws IOException { // 將out、writer中的數據強制輸出到WapperedResponse的buffer裡面,否則取不到數據 flushBuffer(); return buffer.toByteArray(); } //內部類,對ServletOutputStream進行包裝 private class WapperedOutputStream extends ServletOutputStream{ private ByteArrayOutputStream bos=null; public WapperedOutputStream(ByteArrayOutputStream stream) throws IOException{ bos=stream; } public void write(int b) throws IOException{ bos.write(b); } } }
編寫具體的Filter,內容如下
package org.mice.ipchange; import java.io.IOException; import java.io.PrintWriter; import java.util.Enumeration; import java.util.MissingResourceException; import java.util.ResourceBundle; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class IPChangeFilter implements Filter { public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 需要設置這個,以防亂碼 response.setContentType("text/html;charset=GBK"); HttpServletRequest httpReq = (HttpServletRequest) request; HttpServletResponse httpResp = (HttpServletResponse) response; ResponseWrapper respWrapper = new ResponseWrapper(httpResp); chain.doFilter(request, respWrapper); // weblogic8不支持response.setCharacterEncoding // response.setCharacterEncoding("GBK"); String content = new String(respWrapper.getResponseData()); String result = replaceText(content); httpResp.setContentType("text/html;charset=GBK"); PrintWriter out = httpResp.getWriter(); out.println(result); out.close(); } /** * 替換內容 */ private String replaceText(String content) { Enumeration enumes = RESOURCE_BUNDLE.getKeys(); while (enumes.hasMoreElements()) { String o = enumes.nextElement().toString(); content = content.replaceAll(o, RESOURCE_BUNDLE.getString(o)); } return content; } // 替換文字的配置文件路徑 private static final String BUNDLE_NAME = "org.mice.ipchange.ipchange"; // 加載配置文件 private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle .getBundle(BUNDLE_NAME); // 獲取替換文字 public static String getString(String key) { try { return RESOURCE_BUNDLE.getString(key); } catch (MissingResourceException e) { e.printStackTrace(); } return key; } public void init(FilterConfig arg0) throws ServletException { // TODO Auto-generated method stub } public void destroy() { // TODO Auto-generated method stub } }
最後,在配置文件ipchange.properties中配置好你要替換的鍵值對就可以了,對了,別忘了在你的web.xml中定義Filter,並使用Filter。
作者:csdn博客 yueritian