Liny_@NotePad

沉迷ACG中

Struts2中拦截器与过滤器的执行顺序

YOYO posted @ 2009年4月24日 23:10 in 【Java EE】 with tags struts2 拦截器 过滤器 , 12838 阅读

通过上图可以看到,顺序应该是我们配的filter在前,之后是struts2的FilterDispatcher,然后是各个拦截器,最后原路返回。

下面我们来验证一下:

web.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app version="2.4"
  3.         xmlns="http://java.sun.com/xml/ns/j2ee"
  4.         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5.         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
  6.         http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
  7.   <welcome-file-list>
  8.     <welcome-file>login.jsp</welcome-file>
  9.   </welcome-file-list>
  10.  
  11.   <filter>
  12.         <filter-name>MyFilter</filter-name>
  13.         <filter-class>filter.MyFilter</filter-class>
  14.   </filter>
  15.   <filter-mapping>
  16.         <filter-name>MyFilter</filter-name>
  17.         <url-pattern>/*</url-pattern>
  18.   </filter-mapping>
  19.  
  20.   <filter>
  21.         <filter-name>struts2</filter-name>
  22.         <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
  23.   </filter>
  24.   <filter-mapping>
  25.         <filter-name>struts2</filter-name>
  26.         <url-pattern>/*</url-pattern>
  27.   </filter-mapping>
  28.  
  29. </web-app>

struts.xml 

  1. <!DOCTYPE struts PUBLIC
  2.          "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
  3.          "http://struts.apache.org/dtds/struts-2.0.dtd">
  4.  <struts>
  5.      <package name="default" extends="struts-default">
  6.         <interceptors>
  7.            <interceptor name="loginInterceptor" class="interceptor.LoginInterceptor" />
  8.            <interceptor-stack name="loginStack">
  9.               <interceptor-ref name="loginInterceptor" />
  10.               <interceptor-ref name="defaultStack" />
  11.            </interceptor-stack>
  12.         </interceptors>
  13.         <default-interceptor-ref name="loginStack"></default-interceptor-ref>
  14.         <global-results>
  15.            <result name="login">/login.jsp</result>
  16.         </global-results>
  17.         <action name="Login" class="action.LoginAction">
  18.            <result>/index.jsp</result>
  19.         </action>
  20.      </package>
  21.  </struts>

login.jsp

  1. <%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
  2. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  3. <html>
  4.   <head>
  5.     <title>My JSP 'index.jsp' starting page</title>
  6.   </head>
  7.  
  8.   <body>
  9.     <h3>Login</h3>
  10.     <hr>
  11.     <form action="Login.action" method="POST">
  12.         Name: <input type="text" name="username" />
  13.         <input type="submit" value="submit" />
  14.     </form>
  15.   </body>
  16. </html>

index.jsp

  1. <%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
  2. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  3. <html>
  4.   <head>
  5.     <title>My JSP 'index.jsp' starting page</title>
  6.   </head>
  7.  
  8.   <body>
  9.     <h3>Login Success!</h3>
  10.   </body>
  11. </html>

filter.MyFilter

  1. package 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. public class MyFilter implements Filter {
  13.  
  14.         public void destroy() {
  15.         }
  16.  
  17.         public void doFilter(ServletRequest request, ServletResponse response,
  18.                         FilterChain chain) throws IOException, ServletException {
  19.                
  20.                 System.out.println("请求过滤");
  21.                
  22.                 chain.doFilter(request, response);
  23.                
  24.                 System.out.println("返回过滤");
  25.                
  26.         }
  27.  
  28.         public void init(FilterConfig arg0) throws ServletException {
  29.         }
  30.  
  31. }
  32.  

 interceptor.LoginInterceptor

  1. package interceptor;
  2.  
  3. import org.apache.struts2.ServletActionContext;
  4.  
  5. import com.opensymphony.xwork2.ActionInvocation;
  6. import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
  7.  
  8. public class LoginInterceptor extends AbstractInterceptor {
  9.  
  10.         private static final long serialVersionUID = -2796326480994355318L;
  11.  
  12.         @Override
  13.         public String intercept(ActionInvocation ai) throws Exception {
  14.                
  15.                 System.out.println("请求拦截");
  16.                
  17.                 if(!"YOYO".equals(ServletActionContext.getRequest().getParameter("username"))){
  18.                         return "login";
  19.                 }
  20.                
  21.                 String result = ai.invoke();
  22.                
  23.                 System.out.println("返回拦截");
  24.                
  25.                 return result;
  26.         }
  27.  
  28. }

 action.LoginAction

  1. package action;
  2.  
  3. public class LoginAction {
  4.        
  5.         public String execute(){
  6.                 System.out.println("登陆ACTION");
  7.                
  8.                 return "success";
  9.         }
  10.  
  11. }
  12.  

部署好后打开login.jsp,输入任意非"YOYO"字符,控制台打印出

请求过滤
请求拦截
返回过滤

 说明拦截之后还会按照原路返回;

如果输入"YOYO",则打印出

请求过滤
请求拦截
登陆ACTION
返回拦截
返回过滤

由此可以验证它的执行顺序 = =。


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter