小言_互联网的博客

Filter过滤器|敏感词汇过滤

352人阅读  评论(0)


一、需求及分析

(1)对录入的数据进行敏感词汇过滤。
(2)敏感词汇参考 敏感词汇.txt文档
(3)如果是敏感词汇,替换为"***"。

分析:使用代理模式对request对象进行增强,增强获取参数相关方法(getParameter等)。然后放行,传递代理对象。以getParameter为例,getParameterMap,getParameterValue与getParameter的逻辑一样。

二、过滤器

  • @WebFilter(value="/*"):使用注解配置,对所有的servlet都进行过滤。
  • 注意在init()方法中将敏感词汇.txt文件中的每一条敏感语句都放进了list集合中,这个使用流操作的方式要熟练。
  • 使用流操作默认使用gbk编码,所以注意要将敏感词汇.txt中的编码也该改为gbk。
  • 在src下创建了一个名为"敏感词汇.txt"的文件,其中的敏感词汇如下:

package com.gql.filter;
import java.io.BufferedReader;
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;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;

import sun.text.normalizer.Replaceable;

/**
 * 类说明: 
 * 		敏感词汇过滤器
 * 
 * @author qianliangguo
 */
@WebFilter(value="/*")
public class SensitiveFilter implements Filter {
	@Override
	public void doFilter(final ServletRequest req, ServletResponse resp,FilterChain chain) throws IOException, ServletException {
		// 1.创建代理对象,增强getParameter方法
		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 {
				//判断是否是getParameter方法
				if("getParameter".equals(method.getName())){
					String value = (String) method.invoke(req, args);
					if(value != null){
						for (String str : list) {
							if(value.contains(str)){
								value = value.replace(str, "***");
							}
						}
					}
					return value;
				}
				return method.invoke(req, args);
			}
		});
		// 2.放行
		chain.doFilter(Proxy_req, resp);

	}
	private List<String> list = new ArrayList<String>();//敏感词汇集合
	@Override
	public void init(FilterConfig config) throws ServletException {
		try {
			//1.加载文件
			ServletContext servletContext = config.getServletContext();
			String realPath = servletContext.getRealPath("/WEB-INF/classes/敏感词汇.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();
		}
	}
	
	@Override
	public void destroy() {
		// TODO Auto-generated method stub
	}
}

三、xml配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
	http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" >
	<display-name></display-name>
	<welcome-file-list>
		<welcome-file>index.jsp</welcome-file>
	</welcome-file-list>

  <servlet>
    <description>This is the description of my J2EE component</description>
    <display-name>This is the display name of my J2EE component</display-name>
    <servlet-name>testServlet</servlet-name>
    <servlet-class>com.gql.filter.testServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>testServlet</servlet-name>
    <url-pattern>/testServlet</url-pattern>
  </servlet-mapping>
</web-app>

四、测试sevlet

package com.gql.filter;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 类说明:
 * 		测试敏感词汇
 * @author qianliangguo
 */
public class testServlet extends HttpServlet {
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {
		String name = req.getParameter("name");
		String msg = req.getParameter("msg");
		System.out.println(name+":"+msg);
	}
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {
		this.doPost(req, resp);
	}
}

在浏览器地址栏输入:http://localhost:8080/Filter/testServlet?name=用户&msg=嘤嘤嘤,周冬雨你是大坏蛋。返回出的结果如下:

测试成功。


转载:https://blog.csdn.net/weixin_43691058/article/details/104284423
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场