您的位置:首页 > 编程语言 > Java开发

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

2009-08-23 16:18 465 查看



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

下面我们来验证一下:

web.xml


<?xml version="1.0" encoding="UTF-8"?>



<web-app version="2.4"



xmlns="http://java.sun.com/xml/ns/j2ee"



xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"



xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee



http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">


<welcome-file-list>



<welcome-file>login.jsp</welcome-file>



</welcome-file-list>







<filter>



<filter-name>MyFilter</filter-name>



<filter-class>filter.MyFilter</filter-class>



</filter>



<filter-mapping>



<filter-name>MyFilter</filter-name>



<url-pattern>/*</url-pattern>



</filter-mapping>







<filter>



<filter-name>struts2</filter-name>



<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>



</filter>



<filter-mapping>



<filter-name>struts2</filter-name>



<url-pattern>/*</url-pattern>



</filter-mapping>







</web-app>


struts.xml


<!DOCTYPE struts PUBLIC



"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"



"http://struts.apache.org/dtds/struts-2.0.dtd">



<struts>



<package name="default" extends="struts-default">



<interceptors>



<interceptor name="loginInterceptor" class="interceptor.LoginInterceptor" />



<interceptor-stack name="loginStack">



<interceptor-ref name="loginInterceptor" />



<interceptor-ref name="defaultStack" />



</interceptor-stack>



</interceptors>



<default-interceptor-ref name="loginStack"></default-interceptor-ref>



<global-results>



<result name="login">/login.jsp</result>



</global-results>



<action name="Login" class="action.LoginAction">



<result>/index.jsp</result>



</action>



</package>



</struts>


login.jsp


<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>



<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">



<html>



<head>



<title>My JSP 'index.jsp' starting page</title>



</head>







<body>



<h3>Login</h3>



<hr>



<form action="Login.action" method="POST">



Name: <input type="text" name="username" />



<input type="submit" value="submit" />



</form>



</body>



</html>


index.jsp


<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>



<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">



<html>



<head>



<title>My JSP 'index.jsp' starting page</title>



</head>







<body>



<h3>Login Success!</h3>



</body>



</html>


filter.MyFilter


package filter;







import java.io.IOException;







import javax.servlet.Filter;



import javax.servlet.FilterChain;



import javax.servlet.FilterConfig;



import javax.servlet.ServletException;



import javax.servlet.ServletRequest;



import javax.servlet.ServletResponse;







public class MyFilter implements Filter {







public void destroy() {



}







public void doFilter(ServletRequest request, ServletResponse response,



FilterChain chain) throws IOException, ServletException {







System.out.println("请求过滤");







chain.doFilter(request, response);







System.out.println("返回过滤");







}







public void init(FilterConfig arg0) throws ServletException {



}







}






interceptor.LoginInterceptor


package interceptor;







import org.apache.struts2.ServletActionContext;







import com.opensymphony.xwork2.ActionInvocation;



import com.opensymphony.xwork2.interceptor.AbstractInterceptor;







public class LoginInterceptor extends AbstractInterceptor {







private static final long serialVersionUID = -2796326480994355318L;







@Override



public String intercept(ActionInvocation ai) throws Exception {







System.out.println("请求拦截");







if(!"YOYO".equals(ServletActionContext.getRequest().getParameter("username"))){



return "login";



}







String result = ai.invoke();







System.out.println("返回拦截");







return result;



}







}


action.LoginAction


package action;







public class LoginAction {







public String execute(){



System.out.println("登陆ACTION");







return "success";



}







}






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

请求过滤

请求拦截

返回过滤

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

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

请求过滤

请求拦截

登陆ACTION

返回拦截

返回过滤

由此可以验证它的执行顺序 = =。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: