一:Filter称之为"过滤器",用在Servlet外,对request和response进行修改。它是AOP(面向切面编程思想的一种体现),Filter中有一个FilterChain的概念,称之为"过滤器链"。一个FilterChain包含了多个Filter,一个请求到达Servlet或者一个响应到达客户端都要经过FilterChain串联起来的所有Filter。Filter的处理流程如下【Filter于Servlet的耦合性不高,可以随意装装载和卸载】:
*:一个web应用中可以配置多个Filter,Filter的执行顺序,由web.xml文件中配置的<filter-mapping>的先后顺序决定,配置在最前面的最先执行。从上面的图中可以看出,请求的时候先访问的是Filter1,响应的时候先执行的Filter2。请求时候执行Filter的顺序刚好和响应的时候相反。
二:Filter常见的使用场景
权限验证、日志记录、数据压缩、数据加密、格式转换、图像处理(如:添加水印)等......
三:实现Filter的方式是实现 javax.servlet.Filter接口,需要实现3个方法,这3个方法,刚好就是Filter的生命周期。
【代码演示<编码Filter>:有时候请求响应的时候会出现编码格式错误的问题,之前是在每个Servlet中进行处理,这样做造成了代码的重复。可以将这一操作放置在Filter中,只需配置好Filter的url规则,让客户端在访问每个Servlet的时候都会经过这个设置编码的Filter。是的代码更加清晰。】
TestFilter.java
1 package cn.woo.filter; 2 3 import java.io.IOException; 4 5 import javax.servlet.Filter; 6 import javax.servlet.FilterChain; 7 import javax.servlet.FilterConfig; 8 import javax.servlet.ServletException; 9 import javax.servlet.ServletRequest; 10 import javax.servlet.ServletResponse; 11 12 /** 13 * @Description:TODO 演示Filter的使用15 * @version: V1.0 16 * @Date: 2018年8月18日 下午7:17:16 17 */ 18 public class TestFilter implements Filter{ 19 20 private String encoding; 21 22 /** 23 * web应用关闭时,调用该方法[该方法只会执行一次] 24 */ 25 @Override 26 public void destroy() { 27 System.out.println("销毁Filter"); 28 } 29 30 @Override 31 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 32 throws IOException, ServletException { 33 System.out.println("处理之前,request到达目标Servlet之前"); 34 //设置请求和响应的编码格式 35 request.setCharacterEncoding(encoding); 36 response.setCharacterEncoding(encoding); 37 //执行该行会将请求传递至下一个Filter或者Servlet[这句话是必须执行的,不执行的话无法将请求传递至目标Servlet] 38 chain.doFilter(request, response); 39 System.out.println("处理之后,response到达客户端之前"); 40 } 41 42 /** 43 * web应用启动时,调用该方法[该方法只会执行一次] 44 * @param config 该对象可以获取该Filter的初始化参数,和ServletContext信息 45 */ 46 @Override 47 public void init(FilterConfig config) throws ServletException { 48 //获取初始化参数[存放的为utf-8的编码格式] 49 encoding = config.getInitParameter("encoding"); 50 System.out.println("加载Filter"); 51 } 52 }
web.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> 3 <display-name>FilterDemo</display-name> 4 <welcome-file-list> 5 <welcome-file>index.html</welcome-file> 6 <welcome-file>index.htm</welcome-file> 7 <welcome-file>index.jsp</welcome-file> 8 <welcome-file>default.html</welcome-file> 9 <welcome-file>default.htm</welcome-file> 10 <welcome-file>default.jsp</welcome-file> 11 </welcome-file-list> 12 13 <!-- 配置Filter --> 14 <filter> 15 <filter-name>testFilter</filter-name> 16 <filter-class>cn.woo.filter.TestFilter</filter-class> 17 <!-- 当然Filter中可以配置初始化参数,可以在Filter的init方法中通过参数config进行获取 --> 18 <init-param> 19 <param-name>encoding</param-name> 20 <param-value>utf-8</param-value> 21 </init-param> 22 </filter> 23 24 <filter-mapping> 25 <filter-name>testFilter</filter-name> 26 <!-- 配置url匹配规则,只要访问位于/servlet/映射下的Servlet都会触发该Filter --> 27 <!-- url-pattern和dispatcher需要同时满足才能使用该Filter --> 28 <url-pattern>/servlet/*</url-pattern> 29 <!-- 30 REQUEST:配置仅当直接访问Servlet的时候才能触发该Filter 31 INCLUDE:配置当使用<jsp:include>指令访问Servlet的时候才能触发Filter 32 FORWARD:表示仅当Servlet(当然JSP也是Servlet)通过forward方式到达另外个Servlet的时候才会触发Filter 33 ERROR:表示仅当使用<%@ page errorPag = "error.jsp"%>指令指定错误处理页面的时候才会触发该Filter 34 --> 35 <dispatcher>REQUEST</dispatcher> 36 </filter-mapping> 37 38 <!-- 配置Servlet --> 39 <servlet> 40 <servlet-name>testServlet</servlet-name> 41 <servlet-class>cn.woo.servlet.TestServlet</servlet-class> 42 </servlet> 43 44 <servlet-mapping> 45 <servlet-name>testServlet</servlet-name> 46 <url-pattern>/servlet/testServlet</url-pattern> 47 </servlet-mapping> 48 </web-app>
TestServlet.java
1 package cn.woo.servlet; 2 3 import java.io.IOException; 4 5 import javax.servlet.ServletException; 6 import javax.servlet.http.HttpServlet; 7 import javax.servlet.http.HttpServletRequest; 8 import javax.servlet.http.HttpServletResponse; 9 16 public class TestServlet extends HttpServlet{ 17 18 /** 19 * 20 */ 21 private static final long serialVersionUID = 1L; 22 23 @Override 24 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 25 doPost(req, resp); 26 } 27 28 @Override 29 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 30 //获取用户名 31 String name = req.getParameter("name"); 32 System.out.println(name); 33 resp.getWriter().println("请求成功"); 34 } 35 }
结果展示:
①:项目启动
②:通过http://localhost:8080/FilterDemo/servlet/testServlet访问服务器
*:因为上面的方式是采用Get的方式进行访问的,设置utf-8编码格式,仍然会乱码,所以需要配置Tomcat的server.xml文件:
【当然有时候也可能是你的项目本身编码不是utf-8的,所以你要调整统一】
原文地址:https://www.cnblogs.com/wooyoohoo/p/9498385.html