Struts2攔截器詳解

<?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>
相關文章
相關標籤/搜索