servlet的filter使用替换流

来源:互联网 发布:f0改装轮毂数据 编辑:程序博客网 时间:2024/06/05 03:16

servlet过滤器工作流程

屏幕快照 2017-12-20 下午7.49.51.png

servlet过滤器在request到达servlet前可以拦截,在response到达客户端之前可以捕获。这样便可以在过滤器中处理一些请求响应的前置操作或通用操作。

常见的一种应用就是进行敏感词过滤。

但是如果直接使用HttpServletResponse,这是一个流,无法对已经out.println()的内容进行修改。所以这里需要替代流。

替代流(stand-in stream)

原理

在请求到达servlet之前拦截HttpServletResponse,将HttpServletResponse封装成替代流,之后servlet操作的对象即是这个封装后的替代流。这里的封装本质上就是建立一个输出缓冲区,servlet的所有输出都输出到了这个缓冲区,并没有直接写入真正的HttpServletResponse

然后在响应返回阶段,捕获之前封装的HttpServletResponse,然后将servlet中输出到缓冲区的内容,进行敏感词过滤。

实现

利用HttpServletResponseWrapper包装HttpServletResponse,并重写输出流的方法。

一种实现方法如下:

public class BufferedResponse extends HttpServletResponseWrapper {      private PrintWriter printWriter;      private CharArrayWriter charArrayWriter;      public BufferedResponse(HttpServletResponse response) {          super(response);          charArrayWriter = new CharArrayWriter();          printWriter = new PrintWriter(bufferedWriter);      }      @Override      public PrintWriter getWriter() {          return printWriter;      }      public String getOutput() {          return charArrayWriter.toString();      }  }  

过滤器中使用:

 @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {        BufferedResponse bufferedResponse = new BufferedResponse(servletResponse);        // filterChain.doFilter 这里指继续处理后续步骤        filterChain.doFilter(servletRequest, bufferedResponse);         //这里servlet已经处理完,output即servlet的输出,在这里替换敏感词        String output = bufferedResponse.getOutput();    }

以及如果对CharArrayWriter陌生,点击这里 CharArrayWriter

原创粉丝点击