一、需求及分析
(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
查看评论