当访问服务器资源的时候,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() { }}