1、首先,需要编写一个响应的封装器ResponseReplaceWrapper,用它来缓存response中的内容,代码如下:

ResponseReplaceWrapper.java

package com.comp.common;

import java.io.CharArrayWriter;
import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper; public class ResponseReplaceWrapper extends HttpServletResponseWrapper { private CharArrayWriter charWriter = new CharArrayWriter(); public ResponseReplaceWrapper(HttpServletResponse response) {
super(response);
} @Override
public PrintWriter getWriter() throws IOException {
//return super.getWriter();
return new PrintWriter(charWriter);
} public CharArrayWriter getCharWriter() {
return charWriter;
} }

2、编写内容过滤器ReplaceFilter,代码如下:

package com.html.common;

import java.io.IOException;
import java.io.PrintWriter; 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.annotation.WebFilter;
import javax.servlet.http.HttpServletResponse; @WebFilter("/*")
public class ReplaceFilter implements Filter { public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletResponse res = (HttpServletResponse)response;
ResponseReplaceWrapper resp = new ResponseReplaceWrapper(res);
chain.doFilter(request, resp); String outString = resp.getCharWriter().toString();
outString = outString.replace("过滤内容", "***");
PrintWriter out = res.getWriter();
out.write(outString);
} @Override
public void init(FilterConfig arg0) throws ServletException { } @Override
public void destroy() { } }

通过以上步骤,就可以实现过滤非法字符了

ResponseReplaceWrapper.java类里面声明的变量charWriter,一直不得其解,到底是在哪里赋的值。经过调试,发现是在ReplaceFilter类里面chain.doFilter(request, resp);调用完后,charWriter就有值了,我猜大概是这个方法里面有什么操作,把response里的内容赋给了charWriter。

ResponseReplaceWrapper.java类里面复写getWriter()方法,如果返回super.getWriter(),在执行chain.doFilter(request, resp);方法后,页面就有内容输出,但是会导致charWriter没有值;如果返回new PrintWriter(charWriter),在执行chain.doFilter(request, resp);方法后,页面没有内容输出,但是charWriter就有值了,然后拿到charWriter的值,就可以修改这个值,并把修改后的值手工输出到页面上。

我的理解就是,把要输出的内容临时保存起来,进行修改,然后把修改后的内容手工输出。

没有看这个源代码,感觉理解的还是有点一知半解,等我看完源代码,有了更深入的理解,再做补充吧。

最新文章

  1. 几种xml读取方法比较
  2. Ubuntu如何更新源
  3. DirectShow .Net 实现视频
  4. UVaLive 6609 Meeting Room Arrangement (贪心,区间不相交)
  5. URAL 2046 A - The First Day at School 模拟题
  6. oracle系统包——dbms job用法(oracle定时任务)
  7. 渲染器 Shader BitmapShader
  8. makefile知识点归纳的
  9. Vim编辑器的使用和基本配置
  10. 请求服务(RequestService)
  11. thymeleaf-迭代
  12. 创建OpenGL Context(WGL)
  13. chrome "Provisional headers are shown"
  14. ie兼容问题记录
  15. 浏览器登录Dynamics 365 CE没毛病,程序连接却报错。
  16. cryptoJS AES 加解密简单使用
  17. 无状态shiro认证组件(禁用默认session)
  18. Tomcat端口被占用解决方案
  19. 类名.fromObject(obj)静态方法
  20. Swift1.2与Xcode6.3 beta

热门文章

  1. Xamarin.Forms.Xaml.XamlParseException: MarkupExtension not found for trans:Translate using a PCL in Release Mode
  2. C#+arcengine获得栅格数据的像素值(高程)
  3. mysql 查询时间戳(TIMESTAMP)转成常用可读时间格式
  4. linux cpu 100% 脚本
  5. windows快速删除大量文件
  6. Android Lint简介
  7. Material Designer的低版本兼容实现(二)—— Theme
  8. 从Android4.0源码中提取的截图实现(在当前activity中有效,不能全局截图)
  9. [Hook] 跨进程 Binder设计与实现 - 设计篇
  10. SVG 文字居中整理