Servlet過濾器工作過程
Servlet過濾器工作過程
新建一個javaweb項目。如下的web.xml配置。
<?xml version="1.0" encoding="UTF-8"?> <web-app 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" version="3.0"> <filter> <filter-name>PerformanceFilter</filter-name> <filter-class>com.lyx.filter.PerformanceFilter</filter-class> </filter> <filter> <filter-name>PerformanceFilter2</filter-name> <filter-class>com.lyx.filter.PerformanceFilter2</filter-class> </filter> <filter-mapping> <filter-name>PerformanceFilter</filter-name> <url-pattern>/PerformanceServlet</url-pattern> </filter-mapping> <filter-mapping> <filter-name>PerformanceFilter2</filter-name> <url-pattern>/PerformanceServlet</url-pattern> </filter-mapping> <servlet> <servlet-name>PerformanceServlet</servlet-name> <servlet-class>com.lyx.servlet.PerformanceServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>PerformanceServlet</servlet-name> <url-pattern>/PerformanceServlet</url-pattern> </servlet-mapping> </web-app>
有兩個filter,其中PerformanceFilter如下:
package com.lyx.filter; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import java.io.IOException; public class PerformanceFilter implements Filter { private FilterConfig config; public PerformanceFilter() { } @Override public void destroy() { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpServletRequest = (HttpServletRequest) request; System.out.println("=======filter1 start=====" + httpServletRequest.getRequestURI()); chain.doFilter(request, response); //把處理權交給下一個filter System.out.println("=======filter1 end=======" + httpServletRequest.getRequestURI()); } @Override public void init(FilterConfig fConfig) throws ServletException { this.config = fConfig; } }
PerformanceFilter2如下:
package com.lyx.filter; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import java.io.IOException; /** * 在這個filter中統計請求到響應的時間 */ public class PerformanceFilter2 implements Filter { public void destroy() { } public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { HttpServletRequest httpServletRequest = (HttpServletRequest) req; System.out.println("=======filter2 start=====" + httpServletRequest.getRequestURI()); long start = System.currentTimeMillis(); chain.doFilter(req, resp); long end = System.currentTimeMillis(); System.out.println("total=" + (end - start)); System.out.println("=======filter2 end=======" + httpServletRequest.getRequestURI()); } public void init(FilterConfig config) throws ServletException { } }
其中servlet如下:
package com.lyx.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet(name = "PerformanceServlet", urlPatterns = {"/PerformanceServlet"}, loadOnStartup = 1) public class PerformanceServlet extends HttpServlet { private static final long serialVersionUID = 1L; public PerformanceServlet() { super(); } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); String name = request.getParameter("name"); out.println("<html>"); out.println("<head>"); out.println("<title>Hello Servlet</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1> Hello! " + name + " !</h1>"); out.println("</body>"); out.println("</html>"); out.close(); } }
ok,啟動web程序,查看后臺打印情況:
=======filter1 start=====/PerformanceServlet
=======filter2 start=====/PerformanceServlet
total=2
=======filter2 end=======/PerformanceServlet
=======filter1 end=======/PerformanceServlet
很直觀的反映了filter的執行過程,尤其當多個filter匹配時。。。
總結多個filter的執行過程:
過濾器的執行流程了:執行第一個過濾器的chain.doFilter()之前的代碼——>第二個過濾器的chain.doFilter()之前的代碼——>……——>第n個過濾器的chain.doFilter()之前的代碼——>所請求servlet的service()方法中的代碼——>所請求servlet的doGet()或doPost()方法中的代碼——>第n個過濾器的chain.doFilter()之后的代碼——>……——>第二個過濾器的chain.doFilter()之后的代碼——>第一個過濾器的chain.doFilter()之后的代碼。
===END===
來自:http://my.oschina.net/xinxingegeya/blog/323763
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!