J2EE通过Filter替换返回页面的内容
一个汗青项目,客户要求改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