使用Filter过滤非法内容
2024-08-24 20:25:18
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的值,就可以修改这个值,并把修改后的值手工输出到页面上。
我的理解就是,把要输出的内容临时保存起来,进行修改,然后把修改后的内容手工输出。
没有看这个源代码,感觉理解的还是有点一知半解,等我看完源代码,有了更深入的理解,再做补充吧。
最新文章
- 几种xml读取方法比较
- Ubuntu如何更新源
- DirectShow .Net 实现视频
- UVaLive 6609 Meeting Room Arrangement (贪心,区间不相交)
- URAL 2046 A - The First Day at School 模拟题
- oracle系统包——dbms job用法(oracle定时任务)
- 渲染器 Shader BitmapShader
- makefile知识点归纳的
- Vim编辑器的使用和基本配置
- 请求服务(RequestService)
- thymeleaf-迭代
- 创建OpenGL Context(WGL)
- chrome ";Provisional headers are shown";
- ie兼容问题记录
- 浏览器登录Dynamics 365 CE没毛病,程序连接却报错。
- cryptoJS AES 加解密简单使用
- 无状态shiro认证组件(禁用默认session)
- Tomcat端口被占用解决方案
- 类名.fromObject(obj)静态方法
- Swift1.2与Xcode6.3 beta
热门文章
- Xamarin.Forms.Xaml.XamlParseException: MarkupExtension not found for trans:Translate using a PCL in Release Mode
- C#+arcengine获得栅格数据的像素值(高程)
- mysql 查询时间戳(TIMESTAMP)转成常用可读时间格式
- linux cpu 100% 脚本
- windows快速删除大量文件
- Android Lint简介
- Material Designer的低版本兼容实现(二)—— Theme
- 从Android4.0源码中提取的截图实现(在当前activity中有效,不能全局截图)
- [Hook] 跨进程 Binder设计与实现 - 设计篇
- SVG 文字居中整理