JavaWeb 过滤敏感词汇

提交的表单数据,常常要检查有没有敏感词汇,如果有,需要给出提示,或者替换为*。

检查、替换敏感词汇有3种常用的方式

(1)在Servlet中操作。

(2)在Filter中先检查。如果要替换敏感词汇,request没有setParameter()方法重新设置请求参数,怎么向Servlet中传递替换后的请求参数?使用request.setAttribute()把这些修改后的请求参数放到request域中即可。

(3)在Filter中创建request的代理,增强getParameter()方法,然后传入代理: chain.doFilter(request的代理对象 resp); 。如何增强getParameter()方法?getParameter()不是要返回一个String吗,先调用原来的getParameter()获取值,检查值中是否有敏感词汇,有就替换掉敏感词汇,返回替换后的值,没有敏感词汇就返回原值。

(1)、(2)很简单,此处只演示(3)。

敏感词汇

敏感词汇很多,可以存储在数据库中,也可以存储在文本文件中。

此处我们在项目根目录下新建文件夹resource,标识为资源根目录。resource下新建 illegal_word.txt 存储敏感词汇,一行一个。

煞笔
制杖
cxk

每次都从数据库读或文件取读敏感词汇,会增加时间开销,可以把取敏感词汇放到ServletContext中,全局共享、随时可用。

怎么放?Filter的init()方法在Filter生命周期中只调用一次,可以在init()中读取敏感词汇,将敏感词汇放到ArrayList<String>中,再将这个list放到ServletContext中,这样避免了每访问一次就读取一次的问题。

表单

<form action="handlerServlet" method="post">
        评论:<textarea name="comment" rows="10" cols="50"></textarea>
        <button type="submit">提交</button>
    </form>

Filter

@WebFilter("/handlerServlet")
public class HandlerFilter implements Filter {
    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        //解决中文乱码
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");

        ClassLoader classLoader = req.getClass().getClassLoader();
        Class<?>[] interfaces = req.getClass().getInterfaces();
        //创建InvocationHandler接口的实例。此处使用匿名内部类来创建
        InvocationHandler invocationHandler = new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                //只增强getParameter()
                if(method.getName().equals("getParameter")){
                    //调用原有的getParameter()获取参数值
                    String text = (String) method.invoke(req, args);

                    //检查是否有敏感词汇
                    Object obj = req.getServletContext().getAttribute("illegal_word_list");
                    ArrayList<String> list=(ArrayList<String>)obj;
                    for (String word : list){
                        if (text.contains(word)){
                            //用一个*替换一个字符
                            String replac="";
                            for(int i=0;i<word.length();i++){
                                replac+="*";
                            }
                            //替换所有匹配
                            text = text.replaceAll(word, replac);
                        }
                    }

                    return text;
                }

                //如果调用的是getParameter(),执行到前面的return就结束了,不会执行到此
                //如果调用的不是getParameter(),就调用原方法,不做修改
                Object returnValue=method.invoke(req,args);  //调用目标方法
                return returnValue;
            }
        };

        //创建req的代理对象
        Object proxyInstance = Proxy.newProxyInstance(classLoader, interfaces, invocationHandler);
        //强转为ServletRequest
        ServletRequest reqProxyInstance = (ServletRequest) proxyInstance;

        //传入req的代理对象
        chain.doFilter(reqProxyInstance, resp);
    }

    public void init(FilterConfig config) throws ServletException {
        InputStream is= this.getClass().getResourceAsStream("/illegal_word.txt");
        //因为要readLine()一行一行地读,需要使用BufferedReader流,所以先转换为Reader,再加Buffer
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);
        ArrayList<String> list=new ArrayList<>();
        String str=null;
        while (true){
            try {
                str=br.readLine();
                if (str!=null)
                    list.add(str);
                else
                    break;
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        //放到ServletContext中
        config.getServletContext().setAttribute("illegal_word_list",list);
    }

}

测试用的Servlet

@WebServlet("/handlerServlet")
public class HandlerServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String comment = request.getParameter("comment");
        response.getWriter().write(comment);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}

效果

这种方式是增强getParameter(),通过getParameter()获取参数值时,都会先自动检测是否有敏感词汇。

原文地址:https://www.cnblogs.com/chy18883701161/p/11437689.html

时间: 2024-10-11 16:33:14

JavaWeb 过滤敏感词汇的相关文章

过滤敏感词汇

第一种方式 创建敏感词汇文件 首先需要准备一个txt格式的文件用于存放需要过滤的敏感词汇,这个文件放到resources资源文件的根目录 java代码 service代码 package com.ccytsoft.wkc.service; import lombok.Data; import org.springframework.stereotype.Service; import java.io.BufferedReader; import java.io.IOException; impo

Java过滤敏感词语/词汇---DFA算法

最近网站需要在评论.投稿等地方过滤敏感词汇,于是在网上查找了相关教程,特此整理分享. 关于DFA算法,详细的可以去http://blog.csdn.net/u013378306/article/details/52764955 看看. 在这纪录下如何配合js验证控件validate来使用它: 首先把工具类导入到项目中: package com.test.util; import java.io.BufferedReader; import java.io.File; import java.io

敏感词汇过滤(不区分大小写)

最近项目中,用户评论内容需要屏蔽敏感词汇,从网上总结以下方法,(不区分大小写,如想设置大小写敏感,可以把代码中content..toLowerCase()去掉).具体看代码: 1.读取敏感词汇文档 <span style="font-size:18px;">package com.blemall.wizlife.util.sensitive; import java.io.BufferedReader; import java.io.File; import java.io

js过滤检测敏感词汇

html: <textarea rows="10" cols="100" id="myDiv"></textarea> <button id="getFile" onclick="yz()">校验文字</button> js: //禁止多次请求 let stRs=sessionStorage.getItem('stRs')?sessionStorage.get

javaEE之---------过滤敏感词(filter)

我们在聊天的时候的或者留言的时候,有部分词是不允许发表出来.我们可以采用过滤器实现这个功能. 我们只是简单利用过滤器实现这个过滤的功能,有些地方没写的很全 前台代码: <span style="font-size:18px;"> <body> <form action="<c:url value='/WordServlet'/>" method="post"> 姓名:<input type=&

过滤敏感词方式

一.利用正则表达式 关键正则表达式 .*(关键词1|关键词2|关键词3).* 模拟业务代码 @WebServlet(name = "PatternControl", urlPatterns = {"/p"}) public class PatternControl extends HttpServlet { private static final Pattern pattern = initPattern(); private static Pattern ini

过滤敏感字符

原文:过滤敏感字符 源代码下载地址:http://www.zuidaima.com/share/1550463636458496.htm 有疑问请联系我.

DFA算法过滤敏感词整理

这里有部分是从网上找的,但看起来太乱了,分的太散了.研究了几天,整理出来,有问题的话还请大虾们提出来.... package org.rui.util; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.util.HashMap; i

strtr对用户输入的敏感词汇进行过滤

/** * 过滤用户输入的基本数据,防止script攻击 * * @access public * @return string */ function compile_str($str) { $arr = array('<' => '<', '>' => '>','"'=>'”',"'"=>'’'); return strtr($str, $arr); }