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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!