话不多说,先来看看Struts2的内置拦截器栈,

<interceptors>

           <interceptor name="alias" class="com.opensymphony.xwork2.interceptor.AliasInterceptor"/>

           <interceptor name="autowiring" class="com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInterceptor"/>

           <interceptor name="chain" class="com.opensymphony.xwork2.interceptor.ChainingInterceptor"/>

           <interceptor name="conversionError" class="org.apache.struts2.interceptor.StrutsConversionErrorInterceptor"/>

           <interceptor name="cookie" class="org.apache.struts2.interceptor.CookieInterceptor"/>

           <interceptor name="clearSession" class="org.apache.struts2.interceptor.ClearSessionInterceptor" />

           <interceptor name="createSession" class="org.apache.struts2.interceptor.CreateSessionInterceptor" />

           <interceptor name="debugging" class="org.apache.struts2.interceptor.debugging.DebuggingInterceptor" />

           <interceptor name="externalRef" class="com.opensymphony.xwork2.interceptor.ExternalReferencesInterceptor"/>

           <interceptor name="execAndWait" class="org.apache.struts2.interceptor.ExecuteAndWaitInterceptor"/>

           <interceptor name="exception" class="com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor"/>

           <interceptor name="fileUpload" class="org.apache.struts2.interceptor.FileUploadInterceptor"/>

           <interceptor name="i18n" class="com.opensymphony.xwork2.interceptor.I18nInterceptor"/>

           <interceptor name="logger" class="com.opensymphony.xwork2.interceptor.LoggingInterceptor"/>

           <interceptor name="modelDriven" class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/>

           <interceptor name="scopedModelDriven" class="com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor"/>

           <interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>

           <interceptor name="actionMappingParams" class="org.apache.struts2.interceptor.ActionMappingParametersInteceptor"/>

           <interceptor name="prepare" class="com.opensymphony.xwork2.interceptor.PrepareInterceptor"/>

           <interceptor name="staticParams" class="com.opensymphony.xwork2.interceptor.StaticParametersInterceptor"/>

           <interceptor name="scope" class="org.apache.struts2.interceptor.ScopeInterceptor"/>

           <interceptor name="servletConfig" class="org.apache.struts2.interceptor.ServletConfigInterceptor"/>

           <interceptor name="sessionAutowiring" class="org.apache.struts2.spring.interceptor.SessionContextAutowiringInterceptor"/>

           <interceptor name="timer" class="com.opensymphony.xwork2.interceptor.TimerInterceptor"/>

           <interceptor name="token" class="org.apache.struts2.interceptor.TokenInterceptor"/>

           <interceptor name="tokenSession" class="org.apache.struts2.interceptor.TokenSessionStoreInterceptor"/>

           <interceptor name="validation" class="org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor"/>

           <interceptor name="workflow" class="com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor"/>

           <interceptor name="store" class="org.apache.struts2.interceptor.MessageStoreInterceptor" />

           <interceptor name="checkbox" class="org.apache.struts2.interceptor.CheckboxInterceptor" />

           <interceptor name="profiling" class="org.apache.struts2.interceptor.ProfilingActivationInterceptor" />

           <interceptor name="roles" class="org.apache.struts2.interceptor.RolesInterceptor" />

           <interceptor name="jsonValidation" class="org.apache.struts2.interceptor.validation.JSONValidationInterceptor" />

           <interceptor name="annotationWorkflow" class="com.opensymphony.xwork2.interceptor.annotations.AnnotationWorkflowInterceptor" />

           <interceptor name="multiselect" class="org.apache.struts2.interceptor.MultiselectInterceptor" />


           <!-- Basic stack -->

           <interceptor-stack name="basicStack">

               <interceptor-ref name="exception"/>

               <interceptor-ref name="servletConfig"/>

               <interceptor-ref name="prepare"/>

               <interceptor-ref name="checkbox"/>

               <interceptor-ref name="multiselect"/>

               <interceptor-ref name="actionMappingParams"/>

               <interceptor-ref name="params">

                   <param name="excludeParams">dojo\..*,^struts\..*</param>

               </interceptor-ref>

               <interceptor-ref name="conversionError"/>

           </interceptor-stack>

这些配置都在你的默认包中;你不需要去调用即可使用;内置的拦截器很完美了;

为了体验拦截器的工作原理,下面给出一个自定义的拦截器;

第一步:配置struts.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<!--定义-->
<package name="my" extends="struts-default">
        <interceptors>
            <interceptor name="myAuthority" class="nyist.interceptor.MyAuthority"></interceptor>
        </interceptors>
                                                                                                                          
        <action name="Login" class="nyist.action.LoginAction">
            <result>/welcome.jsp</result>
            <result name="error">/error.jsp</result>
        </action>
        <action name="Inner">
            <result>/WEB-INF/inner_jsps/MyJsp.jsp</result>
            <result name="error">/WEB-INF/inner_jsps/error.jsp</result>
            <!--调用-->
            <interceptor-ref name="myAuthority"></interceptor-ref>
            <interceptor-ref name="defaultStack"></interceptor-ref>
        </action>
    </package>
</struts>


第二步:前台界面

<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>
<%@taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>登录页面</title>
</head>
<body>
<form action="Login.action" method="post">
<table align="center">
    <caption><h3>用户登录</h3></caption>
    <tr>
        <td>用户名:<input type="text" name="username"/></td>
    </tr>
    <tr>
        <td>密码:<input type="text" name="password"/></td>
    </tr>
    <tr align="center">
        <td><input type="submit" value="登录"/>
            <input type="reset" value="重填" /></td>
    </tr>
</table>
</form>
</body>
</html>



第三步:Action

package nyist.action;
import javax.servlet.http.HttpSession;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
public class LoginAction implements Action {
    private String username;
    private String password;
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String execute() throws Exception {
        ActionContext.getContext().getSession().put("tip", "login");
        return Action.SUCCESS;
    }
}


第四步:自定义拦截器

package nyist.interceptor;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class MyAuthority extends AbstractInterceptor {
    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        String tip=(String)invocation.getInvocationContext().getSession().get("tip");
        System.out.println("tip value is "+tip);
        if (tip==null){
            System.out.println("be intercepted!");
            return Action.ERROR;
        }else{
            System.out.println("successfully visiting MyJsp page!");
            return invocation.invoke();
        }
    }
}



第五步:结果页面


<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
                                                             
    <title>My JSP 'welcome.jsp' starting page</title>
                                                             
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">  
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->
  </head>
                                                           
  <body>
   welcome!<br>
   欢迎登录<a href="Inner">内部</a>页面查看其他内容。
  </body>
</html>dao


到这里自定义的拦截器就完成了,你可以体会一下拦截器的作用!