首页 > 编程知识 正文

敏感词过滤怎么做,如何利用python敏感词过滤

时间:2023-05-05 17:49:52 阅读:215463 作者:405

1.Filter过滤器 概念:

       当访问服务器资源的时候,Filter(过滤器)就可以将请求拦截下来完成一些如:登录验证、过滤敏感字符等t特殊的功能。

实现步骤:

        1.定义一个类,实现接口Filter
        2.复写方法
        3.配置拦截路径
                 1.web.xml
                 2.注解

代码注解:

1.首先我们创建一个类实现Filter接口,并打上注解@WebFilter("/*")以过滤所有路径下的请求。

@WebFilter("/*")public class SensitiveWordsFilter implements Filter{....}

2.复写类中的方法。其中doFilter方法的参数有请求(req)、响应(resp)和当前 Filter 链的对象(chain)。

然后创建一个list集合用于存储敏感词汇。

init方法中的参数有配置对象(config)

public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {....}private List<String> list=new ArrayList<>(); //敏感词汇集合public void init(FilterConfig config) throws ServletException{....}public void destroy() {}

 

3.配置拦截路径:拦截路径的配置放在init方法(服务器启动时会调用init方法,并只执行一次)中,在服务器启动后就会首先try一下能不能找到响应的敏感词汇文件(这里因为方便添加敏感词汇使用txt文件,也可以直接将,敏感词汇写入list集合中),然后遍历文本内容,将敏感词汇添加到之前创建的list集合中。

public void init(FilterConfig config) throws ServletException { try { //1.加载文件,获取文件真实路径 ServletContext servletContext = config.getServletContext(); String realPath = servletContext.getRealPath("/src/敏感词汇.txt"); //2.读取文件 BufferedReader br = new BufferedReader(new FileReader(realPath)); //3,将文件的每一行数据添加到list中 String line=null; while ((line=br.readLine())!=null){ list.add(line); } br.close(); System.out.println(list); } catch (Exception e) { e.printStackTrace(); } }

4.拦截:①首先新建一个代理对象并和真实对象实现相同的接口。

              ②再创建一个invoke(反射)方法,传入参数:proxy(代理对象)、method(被反射的方法)、args(增强后返回的集合)。在方法中判断是否是getParmeter方法后,如果是则获取method方法中反射过来的值并遍历处理,将获取值中与敏感词汇相同的字符替换成“***”,然后将增强后的值返回出来。

public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { //1.创建代理对象,增强getParmeter方法 ServletRequest proxy_req = (ServletRequest)Proxy.newProxyInstance(req.getClass().getClassLoader(), req.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //增强getParmeter方法 //判断是否是getParmeter方法 if(method.getName().equals("getParmeter")){ //增强返回值 //获取返回值 String value=(String)method.invoke(req,args); if(value!=null){ for (String str : list) { if(value.contains(str)){ value=value.replaceAll(str,"***"); } } } return value; } //判断方法名是否是 getParameterMap //判断方法名是否是 getParameterValue return method.invoke(req,args); } }); chain.doFilter(proxy_req, resp); }

这样就可以将服务器中出现的敏感词汇屏蔽掉了。

整个敏感词汇过滤器的代码如下:

package web.filter;import javax.servlet.*;import javax.servlet.annotation.WebFilter;import java.io.BufferedReader;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.IOException;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import java.util.ArrayList;import java.util.List;/*敏感词汇过滤器 */@WebFilter("/*")public class SensitiveWordsFilter implements Filter { public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { //1.创建代理对象,增强getParmeter方法 ServletRequest proxy_req = (ServletRequest)Proxy.newProxyInstance(req.getClass().getClassLoader(), req.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //增强getParmeter方法 //判断是否是getParmeter方法 if(method.getName().equals("getParmeter")){ //增强返回值 //获取返回值 String value=(String)method.invoke(req,args); if(value!=null){ for (String str : list) { if(value.contains(str)){ value=value.replaceAll(str,"***"); } } } return value; } //判断方法名是否是 getParameterMap //判断方法名是否是 getParameterValue return method.invoke(req,args); } }); chain.doFilter(proxy_req, resp); } private List<String> list=new ArrayList<>(); //敏感词汇集合 public void init(FilterConfig config) throws ServletException { try { //1.加载文件,获取文件真实路径 ServletContext servletContext = config.getServletContext(); String realPath = servletContext.getRealPath("/src/敏感词汇.txt"); //2.读取文件 BufferedReader br = new BufferedReader(new FileReader(realPath)); //3,将文件的每一行数据添加到list中 String line=null; while ((line=br.readLine())!=null){ list.add(line); } br.close(); System.out.println(list); } catch (Exception e) { e.printStackTrace(); } } public void destroy() { }}

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。