工作原理:在servlet将内容输出到response时,response将内容缓存起来,在filter中进行替换,然后再输出到客户端浏览器。由于默认的response并不能严格的缓存输出内容, 因此需要自定义一个具备缓存功能的response。可以通过扩展javax.servlet.http.HttpServletResponse类来实现自定义的response,只要覆盖相应的方法即可。
1、HttpServletResponseWrapperDemo.java
package servlet;
import java.io.CharArrayWriter;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
public class HttpServletResponseWrapperDemo extends HttpServletResponseWrapper {
private CharArrayWriter charArrayWriter = new CharArrayWriter();
public HttpServletResponseWrapperDemo(HttpServletResponse response) {
super(response);
}
@Override
public PrintWriter getWriter() throws IOException {
return new PrintWriter(charArrayWriter);
}
public CharArrayWriter getCharArrayWriter() {
return charArrayWriter;
}
}
2、OutputReplaceFilter.java
package filter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import java.util.Locale;
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.HttpServletResponse;
import servlet.HttpServletResponseWrapperDemo;
public class OutputReplaceFilter implements Filter {
private ResourceBundle bundle = null;
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
HttpServletResponseWrapperDemo response = new HttpServletResponseWrapperDemo((HttpServletResponse)resp);
chain.doFilter(req, response);
String output = response.getCharArrayWriter().toString();
Enumeration<String> enu = bundle.getKeys();
while(enu.hasMoreElements()){
String key = enu.nextElement();
output = output.replace(key, bundle.getString(key));
}
PrintWriter out = resp.getWriter();
out.print(output);
}
@Override
public void init(FilterConfig arg0) throws ServletException {
bundle = ResourceBundle.getBundle("sensitive", Locale.getDefault());
}
}
3、sensitive.properties
china = China
\u738B\u516B\u86CB = **
4、web.xml
<filter>
<filter-name>sensitiveFilter</filter-name>
<filter-class>filter.OutputReplaceFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>sensitiveFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>