Filter的简介
Filter也称之为过滤器,它是Servlet技术中最实用的技术,Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。
它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理。使用Filter的完整流程:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。
详解可参考Java中的Filter过滤器
Filter的配置
Filter的配置有两种方式
1.注解配置方式:注解配置方式要Servlet3.0才开始提供,使用@WebFilter进行配置
2.使用web.xml进行配置
分享
今天分享是敏感词汇过滤的Filter,代码实现采用的注解配置方式。为了实例方便,此次敏感词汇只用了List数组存储两个,但是在实际的开发中这种方法是不可取的,其他的方法为:可以在src的目录下,建立一个txt文件,文件中存敏感词汇或者直接用将敏感词汇存入数据库(建议使用)
分析
对请求数据进行过滤,需要取出request对象中的parameter,然后在设置parameter,但是request对象的方法中并没有setParameter()方法,因此,我们需要对增强request对象,通过动态代理的方法增强request对象
以下为Filter的代码:
功能:过滤“坏蛋”、“笨蛋”。若发现请求参数中有列出的词汇则把相应的词汇用“***”代替
package filter;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.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;/*** Servlet Filter implementation class SensitiveWords*/
@WebFilter("/*")
public class SensitiveWords implements Filter {/*** Default constructor. */public SensitiveWords() {// TODO Auto-generated constructor stub}/*** @see Filter#destroy()*/public void destroy() {// TODO Auto-generated method stub}/*** @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)*/public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {// HttpServletRequest req = (HttpServletRequest)request;//代理类的创建ServletRequest proxy_servlet = (ServletRequest) Proxy.newProxyInstance(request.getClass().getClassLoader(), request.getClass().getInterfaces(), new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {if(method.getName().equals("getParameter")){String value = (String) method.invoke(request, args);List<String> list = new ArrayList<String>();list.add("坏蛋");list.add("笨蛋");if(value != null){for(String str:list){if(value.contains(str)){value = value.replaceAll(str, "***");}} }return value;}// TODO Auto-generated method stubreturn method.invoke(request,args);}});chain.doFilter(proxy_servlet, response);}/*** @see Filter#init(FilterConfig)*/public void init(FilterConfig fConfig) throws ServletException {// TODO Auto-generated method stub}
}
为了测试Filter的正确性,可以建一个TestServlet进行测试
代码如下
package action;import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*** Servlet implementation class TestServlet*/
@WebServlet("/testServlet")
public class TestServlet extends HttpServlet {private static final long serialVersionUID = 1L;/*** @see HttpServlet#HttpServlet()*/public TestServlet() {super();// TODO Auto-generated constructor stub}/*** @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)*/protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String name = request.getParameter("name");String msg= request.getParameter("msg");System.out.println("name"+name+"msg"+msg);}/*** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)*/protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}}
启动服务器之后直接访问:http://localhost:8080/testServlet?name="坏蛋"&msg="你的是一个笨蛋"
可以看到控制台打印出了过滤后的结果: