Filter实现全站违法关键词屏蔽

思路:客户端请求服务器数据,经过Filter过滤(请求放行,响应拦截),服务器向客户端返回数据时,在Filter中修改掉返回数据中违法的部分。

修改服务器的响应需要自定义一个HttpServletResponse的包装类,继承自HttpServletResponseWrapper即可实现自己的HttpServletResponse的包装类。

大概是这样的:

//package com.ecshop.tools;
import java.io.CharArrayWriter;
import java.io.InputStream;
import java.io.PrintWriter;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
public class ShieldKeywordResponseWrapper extends HttpServletResponseWrapper{
    private CharArrayWriter caw;
    private PrintWriter pw;
    public ShieldKeywordResponseWrapper(HttpServletResponse response) {
        super(response);
        // 这个是我们保存返回结果的地方
        caw = new CharArrayWriter();
        // 这个是包装PrintWriter的,让所有结果通过这个PrintWriter写入到caw中
        pw = new PrintWriter(caw);
    }
    @Override
    public PrintWriter getWriter() {
        return pw;
    }
    public String getResult() {
        return caw.toString();
    }
}

因为违法关键词都包含在响应文本消息中,服务器向请求客户端响应文本消息必须获取HttpServletResponse对象中的PrintWriter文本输出流对象进行输出消息,所以我们的这个封装类覆盖HttpServletResponse的getWriter是很重要的一步,我这个封装类的意思是让服务器响应数据时使用我们修改过的PrintWriter文本输出流,输出的数据并不立刻响应给客户,而是把输出的数据都保留在了CharArrayWriter这个对象中,当控制层执行完毕我们就可以在Filter中进行获取CharArrayWriter对象中的数据进行修改了,修改完毕我们在返回给你客户,就是我们想要的效果了。(而默认HttpServletResponse的PrintWriter对象是由tomcat自己所扩展自PrintWriter的CoyoteWriter对象,CoyoteWriter对象所打印的数据都保留在OutputBuffer对象(也是tomcat自己所扩展自Writer的一个对象)中,我们不方便获取它的文本数据,所以我们修改掉它,当OutputBuffer执行flush就发送消息,或者不执行让servlet结束后自动发送消息)。

以上是我看了一点tomcat源码然后瞎推理,对不对无所谓。。

当我们HttpServletResponse的包装类弄完剩下的就好办了。

//我们看下过滤器中的doFilter函数部分代码就足够了
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletResponse res= (HttpServletResponse) response;
     //我们刚刚做的包装类在这里
        ShieldKeywordResponseWrapper skrw= new ShieldKeywordResponseWrapper(res);
        chain.doFilter(request, skrw);
        //在servlet处理完毕后我们开始做处理
        String result = skrw.getResult();
        //替换关键词为*
        Properties p = new Properties();
        p.load(ShieldKeywords.class.getResourceAsStream("/keywords.properties"));
        Set<Entry<Object, Object>> se= p.entrySet();
        for(Entry<Object, Object> e:se){
            result = result.replace(String.valueOf(e.getKey()), String.valueOf(e.getValue()));
        }
        // 输出最终的结果
        PrintWriter out = response.getWriter();
        out.write(result);
        //以下两句无作用,CharArrayWriter中为空函数,tomcat自己提供的OutputBuffer执行这两句才有作用
        out.flush();
        out.close();
    }

最后看下keywords.properties文件的内容:

违法词1=*
违法词2=*

建议web.xml中过滤器配置时只映射响应文本数据的请求url,因有的请求是要获取一个文件流,服务器HttpServletResponse响应时文本输出流和字节流是冲突的,正常情况下两者只可取一,不然会报错

时间: 2024-08-24 23:52:16

Filter实现全站违法关键词屏蔽的相关文章

javaweb的Filter过滤器设置全站编码

FIlter配置全站编码有一种方法是重写getParameter方法,也就是继承HttpServletRequestWrapper在重写getParameter方法,还有一种就是如下: public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 将requese进行强转 HttpServletR

wordpress屏蔽恶意关键词搜索

add_action('admin_init', 'php_search_ban_key'); function php_search_ban_key() { add_settings_field('php_search_key', '搜索关键词屏蔽', 'php_search_key_callback_function', 'reading'); register_setting('reading','php_search_key'); } function php_search_key_ca

javaweb开发之解决全站乱码

当我们开发web网站的时候偶尔会出现乱码问题,出现问题之原因是出现中文字符. 不解释了直接上代码 import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.Map; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import j

javaWeb_全站编码

目的 : 实现javaweb项目的全站编码问题 需要解决的问题 : 在何时进行编码问题的解决, 在何处进行编码问题的解决, 才用什么方法进行解决 设计思路 : 在Filter进行全站的编码转换, 对于GET请求 : 使用装饰者模式(是你有你一切拜托你), 修改Request.getParameter()方法, 在getparameter()方法进行编码的转换; 对于POST请求直接在FIilter进行过转换即可. 实际代码 : 1. Filter文件 package com.theangryz.

前辈们的话--大疆技术总监的金玉良言

今天在发烧友看到一篇很好的文章,有很大的启发和震撼,这就是别人一毕业就能进大疆,而我们还在为找工作发愁的原因吗?!! 当然文中说的很多东西都不是我们大多数人都能实现的,人家大一就开始接触嵌入式,入手Linux,学习python,而大一的很多人还沉浸在高考后的喜悦,开学后的迷茫中呢!这就是差距. 还是那句话,兴趣是最好的老师.要是 一开始我们就对机器人,电子技术感兴趣的话,这些其实都不用别人说的,自己就会想尽办法去寻找合适的学习路径. 遇山开山,遇水架桥.兴趣会指导我们找到该找到的一切的.所以,还

足球游戏论坛数据分析--简单粗暴的贝叶斯

前些日子入了PS4的某著名游戏2017, 寻小妖刷ML中.  不得不说刚开始的时候,涛哥坤哥的解说感觉颇为带感.  一个月后...还是关音量吧,解说词太贫乏了 在寻小妖的过程中, 突发奇想看看某著名论坛的数据有没有什么特别的地方,于是scrapy走起... 被服务器ban了几次后, 扒拉下来2w多主贴,30多w回帖存入sqlite数据库 [数据清洗] 使用xpath清洗HTML代码, 筛出板块,帖子内容,作者,时间等等等 删掉爬虫乱跑其他板块扒拉下来的帖子 这第一步清洗说起来简单, 倒也花了不少

java开发总体知识复习

[Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等) 上一篇发了一个找工作的面经, 找工作不宜, 希望这一篇的内容能够帮助到大家.对于这次跳槽找工作, 我准备了挺长的时间, 其中也收集了很多比较好的笔试面试题, 大都是一些常用的基础, 很多都是由于时间原因没有来得及给出答案, 但是题目大都是比较经典实用的, 现在都放到这里, 希望对正处于找工作的博友有一定的帮助. 第一部分: Java基础(此部分面试题题目来自:http://www.ho

logj4.xml

1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE log4j:configuration PUBLIC "-//log4j/log4j Configuration//EN" "log4j.dtd"> 3 <log4j:configuration> 4 <!--输出到控制台--> 5 <appender name=&qu

小白站长是如何战胜注册机攻击的?

我是一个新手站长,也是一个动漫宅.我的小站平时会发布一些新番动漫的资源,还会有相关周边的分享.小站运营的还不错,每天有上百人的注册,论坛活跃度也挺稳定. 正如大家所看到的,我是一个善良的人 ? ??? ?善良的我为了让各位新手站长不走我走过的弯路,所以给大家说说我建站的血泪史.愿世界和平.(? •?_•?)? 对的,建站之路是痛并快乐的,通过查看各种教程,混迹各种论坛.贴吧 ,并在大神们的帮助下,我的小站终于搭建好并上线了(撒花~~~(•??•?)? ??如果你以为故事就这么顺利发展,那就错了!