<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <constant name="struts.devMode" value="true" /> <package name="p1" extends="struts-default"> <!-- 聲明自定義攔截器 --> <interceptors> <interceptor name="demo1Interceptor" class="com.zzz.web.interceptor.Demo1Interceptor"></interceptor> <interceptor name="demo2Interceptor" class="com.zzz.web.interceptor.Demo2Interceptor"></interceptor> </interceptors> <action name="action1" class="com.zzz.web.action.Demo1Action" method="save"> <!-- 使用自定義攔截器:當配置了任何一個攔截器,默認的攔截器棧就不會在工做了 . 當有多個攔截器的時候,是由引用配置決定執行的順序 。 注意:執行順序與聲明無關--> <interceptor-ref name="demo2Interceptor"></interceptor-ref> <interceptor-ref name="demo1Interceptor"></interceptor-ref> <result name="success">/demo1.jsp</result> </action> </package> <!-- 使用自定義攔截器,檢查登陸。最基本的配置方式。 其中存在的問題: 當咱們使用了自定義攔截器以後,默認的攔截器棧就再也不工做了 <package name="p2" extends="struts-default"> <interceptors>聲明攔截器 <interceptor name="checkLoginInterceptor" class="com.zzz.web.interceptor.CheckLoginInterceptor" /> </interceptors> <global-results>全局結果視圖 <result name="input">/login.jsp</result>數據回顯的結果視圖 </global-results> 用戶登陸時,不須要檢查登陸的攔截器工做 <action name="login" class="com.zzz.web.action.Demo2Action" method="login"> <result type="redirectAction">showMain</result> </action> 前往主頁的動做名稱,須要檢查登陸的攔截器工做 <action name="showMain" class="com.zzz.web.action.Demo2Action" > <interceptor-ref name="checkLoginInterceptor"></interceptor-ref> <result>/main.jsp</result> </action> 前往另外一個頁面的動做名稱,須要檢查登陸的攔截器工做 <action name="showOther" class="com.zzz.web.action.Demo2Action" > <interceptor-ref name="checkLoginInterceptor"></interceptor-ref> <result>/otherpage.jsp</result> </action> </package>--> <!-- 1.針對上面的問題,解決辦法是,把默認的攔截器棧也配置進來. <package name="p2" extends="struts-default"> <interceptors> <interceptor name="checkLoginInterceptor" class="com.zzz.web.interceptor.CheckLoginInterceptor" /> </interceptors> <global-results> <result name="input">/login.jsp</result> </global-results> <action name="login" class="com.zzz.web.action.Demo2Action" method="login"> <result type="redirectAction">showMain</result> </action> <action name="showMain" class="com.zzz.web.action.Demo2Action" > 加入自定義攔截器,和默認的攔截器棧 <interceptor-ref name="defaultStack"></interceptor-ref> <interceptor-ref name="checkLoginInterceptor"></interceptor-ref> <result>/main.jsp</result> </action> <action name="showOther" class="com.zzz.web.action.Demo2Action" > 加入自定義攔截器,和默認的攔截器棧 <interceptor-ref name="defaultStack"></interceptor-ref> <interceptor-ref name="checkLoginInterceptor"></interceptor-ref> <result>/otherpage.jsp</result> </action> </package>--> <!-- 2. 上面中存在的弊端,當若是須要攔截的動做不少時,寫起來很繁瑣 <package name="p2" extends="struts-default"> <interceptors> <interceptor name="checkLoginInterceptor" class="com.zzz.web.interceptor.CheckLoginInterceptor" /> 定義一個攔截器棧,把咱們自定義的攔截器和默認的攔截器棧放到一塊兒. <interceptor-stack name="myDefaultStack"> <interceptor-ref name="defaultStack"></interceptor-ref> <interceptor-ref name="checkLoginInterceptor"></interceptor-ref> </interceptor-stack> </interceptors> <global-results> <result name="input">/login.jsp</result> </global-results> <action name="login" class="com.zzz.web.action.Demo2Action" method="login"> <result type="redirectAction">showMain</result> </action> <action name="showMain" class="com.zzz.web.action.Demo2Action" > 直接引入咱們本身定義的攔截器棧,裏面已經包含了默認的攔截器棧 <interceptor-ref name="myDefaultStack"></interceptor-ref> <result>/main.jsp</result> </action> <action name="showOther" class="com.zzz.web.action.Demo2Action" > 直接引入咱們本身定義的攔截器棧,裏面已經包含了默認的攔截器棧 <interceptor-ref name="myDefaultStack"></interceptor-ref> <result>/otherpage.jsp</result> </action> </package> --> <!-- 3, 上面存在的問題,還須要在每一個要用到地方使用攔截器引用。 解決辦法:使用覆蓋struts-default.xml配置文件中的默認攔截器棧,讓咱們的這個稱爲默認的 <package name="p2" extends="struts-default"> <interceptors> <interceptor name="checkLoginInterceptor" class="com.zzz.web.interceptor.CheckLoginInterceptor" /> <interceptor-stack name="myDefaultStack"> <interceptor-ref name="defaultStack"></interceptor-ref> <interceptor-ref name="checkLoginInterceptor"></interceptor-ref> </interceptor-stack> </interceptors> 覆蓋了struts-default.xml中定義的默認攔截器棧。由myDefaultStack把defaultStack給替換了 <default-interceptor-ref name="myDefaultStack"></default-interceptor-ref> <global-results> <result name="input">/login.jsp</result> </global-results> <action name="login" class="com.zzz.web.action.Demo2Action" method="login"> <result type="redirectAction">showMain</result> </action> <action name="showMain" class="com.zzz.web.action.Demo2Action" > <result>/main.jsp</result> </action> <action name="showOther" class="com.zzz.web.action.Demo2Action" > <result>/otherpage.jsp</result> </action> </package> --> <!-- 4 上面中存在的問題,當咱們配置了默認的攔截器棧時,連登錄都被攔截了。 解決辦法: 在AbstractInterceptor的子類中,還有一個抽象類MethodFilterInterceptor,它裏面提供了兩個屬性。 excludeMethods:哪些方法不須要攔截 includeMethods:哪些方法須要攔截 <package name="p2" extends="struts-default"> <interceptors> <interceptor name="checkLoginInterceptor1" class="com.zzz.web.interceptor.CheckLoginInterceptor1" /> <interceptor-stack name="myDefaultStack"> <interceptor-ref name="defaultStack"></interceptor-ref> <interceptor-ref name="checkLoginInterceptor1"> 給自定義攔截器注入參數,告知他哪些方法不須要攔截 <param name="excludeMethods">login</param> </interceptor-ref> </interceptor-stack> </interceptors> <default-interceptor-ref name="myDefaultStack"></default-interceptor-ref> <global-results> <result name="input">/login.jsp</result> </global-results> <action name="login" class="com.zzz.web.action.Demo2Action" method="login"> <result type="redirectAction">showMain</result> </action> <action name="showMain" class="com.zzz.web.action.Demo2Action" > <result>/main.jsp</result> </action> <action name="showOther" class="com.zzz.web.action.Demo2Action" > <result>/otherpage.jsp</result> </action> </package> --> <!-- 5 上咱們在聲明攔截器和定義攔截器棧的時候,可能根本不知道哪些方法須要攔截,哪些不須要 解決辦法:在使用攔截器的時候,注入參數,告訴攔截器哪些須要攔截,哪些不須要 --> <package name="p2" extends="struts-default"> <interceptors> <interceptor name="checkLoginInterceptor1" class="com.zzz.web.interceptor.CheckLoginInterceptor1" /> <interceptor-stack name="myDefaultStack"> <interceptor-ref name="defaultStack"></interceptor-ref> <interceptor-ref name="checkLoginInterceptor1"></interceptor-ref> </interceptor-stack> </interceptors> <default-interceptor-ref name="myDefaultStack"></default-interceptor-ref> <global-results> <result name="input">/login.jsp</result> </global-results> <action name="login" class="com.zzz.web.action.Demo2Action" method="login"> <interceptor-ref name="myDefaultStack"> <!-- 在引用自定義攔截器棧的時候,給指定的攔截器注入參數。方式就是:攔截器名稱.屬性名稱 --> <param name="checkLoginInterceptor1.excludeMethods">login</param> </interceptor-ref> <result type="redirectAction">showMain</result> </action> <action name="showMain" class="com.zzz.web.action.Demo2Action" > <result>/main.jsp</result> </action> <action name="showOther" class="com.zzz.web.action.Demo2Action" > <result>/otherpage.jsp</result> </action> </package> </struts>