平时我们做网页时,不希望页面显示一些非法内容或敏感词语,一般的做法是数据保存到数据库前先做处理或者从数据库中拿出来后再处理,然后输出到客户端(浏览器)。这种做法的局限性是,工作量大,很多地方都需要进行处理。如果使用Filter来处理就很简单,很方便了。
做法:在Servlet将页面内容输出到response时,response将内容缓存起来,然后在Filter中处理,在输出到客户端。
技术点:由于ServletResponse默认不能严格的缓存输出内容,因此需要自定义一个具备缓存功能的response。扩展javax.servlet.http.HttpServletResponseWrapper类来自定义一个response,该类实现了javax.servlet.http.HttpServletResponse接口的所有方法,根据需要在自己的自定义response中进行覆盖即可,比如需要对页面中的字符类内容进行处理,则覆盖父类getWriter()方法,如果需要处理二进制内容,如图片等,则覆盖父类中的getOutputStream()方法。
下面给出一个例子源码,对页面中的敏感词语进行替换。
首先自定义一个response
- package cn.qtone.school.filter;
-
- import java.io.CharArrayWriter;
- import java.io.IOException;
- import java.io.PrintWriter;
-
- import javax.servlet.http.HttpServletResponse;
- import javax.servlet.http.HttpServletResponseWrapper;
-
-
-
-
-
-
-
-
-
- public class CharacterResponseWrapper extends HttpServletResponseWrapper{
-
- private CharArrayWriter charArrayWriter=new CharArrayWriter();
-
- public CharacterResponseWrapper(HttpServletResponse response) {
- super(response);
- }
-
- @Override
-
-
- public PrintWriter getWriter() throws IOException{
- return new PrintWriter(charArrayWriter);
- }
-
- public CharArrayWriter getCharArrayWriter() {
- return charArrayWriter;
- }
-
-
- }
再写个filter
- package cn.qtone.school.filter;
-
- import java.io.FileInputStream;
- import java.io.IOException;
- import java.io.PrintWriter;
- import java.util.Properties;
-
- import javax.servlet.Filter;
- import javax.servlet.FilterChain;
- import javax.servlet.FilterConfig;
- import