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>
相关文章
相关标签/搜索