博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用Filter过滤非法内容
阅读量:7008 次
发布时间:2019-06-28

本文共 2448 字,大约阅读时间需要 8 分钟。

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的值,就可以修改这个值,并把修改后的值手工输出到页面上。

 

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

 

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

转载地址:http://xhjtl.baihongyu.com/

你可能感兴趣的文章
nginx(一)安装
查看>>
Mysql五大引擎之间的区别和优劣之分
查看>>
经典励志对句
查看>>
linux学习笔记——yum安装软件、搭建仓库、rpm命令
查看>>
ESXI6.5创建标准交换机(在vCenter中创建)
查看>>
CollectionUtils简单学习
查看>>
千万级规模高性能、高并发的网络架构经验分享
查看>>
交换机的基本概念和配置
查看>>
longestCommonSubstring
查看>>
关于C#调用大漠插件时提示“{26037A0E-7CBD-4FFF-9C63-56F2D0770214} 的组件时失败”的解决办法...
查看>>
go语言学习--pongo2 fasthttp fasthttprouter pgx
查看>>
Linux Shell sort按照指定的顺序进行排列
查看>>
android Bitmap类方法属性 详细说明
查看>>
我的友情链接
查看>>
China Azure 在HDinsight 中使用Spark 功能
查看>>
sqlserver 2008 R2 审计
查看>>
mysql常用脚本
查看>>
在windows server 2012R2上卸载服务
查看>>
第 10 章 容器监控 - 085 - 如何快速部署 Prometheus?
查看>>
计算机行业小总结
查看>>