文章目录
- 一、需求及分析
- 二、过滤器
- 三、xml配置
- 四、测试sevlet
一、需求及分析
(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 {@Overridepublic 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() {@Overridepublic 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>();//敏感词汇集合@Overridepublic 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();}}@Overridepublic 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/javaeehttp://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 {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {String name = req.getParameter("name");String msg = req.getParameter("msg");System.out.println(name+":"+msg);}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {this.doPost(req, resp);}
}
在浏览器地址栏输入:http://localhost:8080/Filter/testServlet?name=用户&msg=嘤嘤嘤,周冬雨你是大坏蛋。
返回出的结果如下:
测试成功。