分析:
1.对request对象进行加强。加强获取参数相关方法。对过滤的敏感词汇咱们将其放到一个txt文本中,经过init加载。若是txt过滤的敏感词汇中有中文,要把编码格式转换为GBK.
package cn.easyArch.web.filter;java
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;web
@WebFilter("/testServlet") public class SensitiveWordsFilter implements Filter { public void destroy() { } public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { //建立代理对象,加强getPatameter方法 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方法 //判断是不是getParameter方法 if (method.getName().equals("getParameter")){ //加强返回值 //获取返回值 String value= (String) method.invoke(req,args); if (value!=null){ for (String str:sensitive){ if (value.contains(str)){ value=value.replaceAll(str,"***"); } } } return value; } return method.invoke(req,args); } }); //放行 chain.doFilter(proxy_req, resp); } //敏感词聚集合 private List<String> sensitive =new ArrayList<String>(); public void init(FilterConfig config) throws ServletException { try { //加载文件 //获取文件真实路径 ServletContext servletContext=config.getServletContext(); String realPath=servletContext.getRealPath("/WEB-INF/classes/敏感词汇.txt"); //读取文件 BufferedReader br =new BufferedReader(new FileReader(realPath)); //将文件的每一行数据添加到list中 String line=null; while ((line=br.readLine())!=null){ sensitive.add(line); } br.close(); System.out.println(sensitive); } catch (Exception e) { e.printStackTrace(); } }