一)Action拦截器:拦截某个指定的Action(请求)
1、定义拦截器
package com.interceptor;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class InterceptorDemo1 extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation invocation) throws Exception {
// TODO Auto-generated method stub
String user =(String) ActionContext.getContext().getSession().get("user");
if(user == null || "".equals("user"))
return "fail";
return invocation.invoke();
}
}
2、配置struts.xml文件
//如果在项目中使用了自定义的拦截器,那么默认拦截器将不在起作用。
<package name = "default" namespace = "/" extends = "struts-default">
<interceptors>
<interceptor name="interceptor1" class="com.interceptor.InterceptorDemo1"/>
</interceptors>
<action name = "log*" class = "com.acion.LoginAction" method = "log{1}">
<result name = "success" >/log{1}.jsp</result>
</action>
<action name = "adduser" class = "com.acion.UserAction" method = "execute">
<result name = "success" >/adduser.jsp</result>
<result name = "fail" type = "redirect">/login.jsp</result>
<interceptor-ref name="interceptor1"/>
<interceptor-ref name="defaultStack"/>
</action>
</package>
Action拦截只能拦截部分请求,如果需要大面积拦截,就会出现很多重复代码。
二)、全局拦截:将指定的Action统一拦截。与Action拦截的区别在于配置文件上。
<package name = "default" namespace = "/" extends = "struts-default">
<interceptors>
<interceptor name="interceptor1" class="com.interceptor.InterceptorDemo1"/>
<!-- 将默认拦截器和自定义拦截器放入拦截器栈中 -->
<interceptor-stack name="Mystack">
<interceptor-ref name="interceptor1"/>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="Mystack"/>
<action name = "log*" class = "com.acion.LoginAction" method = "log{1}">
<result name = "success" >/log{1}.jsp</result>
</action>
<action name = "adduser" class = "com.acion.UserAction" method = "execute">
<result name = "success" >/adduser.jsp</result>
<result name = "fail" type = "redirect">/login.jsp</result>
</action>
</package>
拦截器代码:
package com.interceptor;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class InterceptorDemo2 extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("调用拦截器");
return invocation.invoke();
}
}
1、返回值问题:因为全局拦截将包中所有拦截器都拦截掉,但拦截器的返回值只能固定一个,在所有被拦截器中,需要配置与拦截器返回值相同的全局结果集。
<package name = "default" namespace = "/" extends = "struts-default">
<interceptors>
<interceptor name="interceptor1" class="com.interceptor.InterceptorDemo1"/>
<!-- 将默认拦截器和自定义拦截器放入拦截器栈中 -->
<interceptor-stack name="Mystack">
<interceptor-ref name="interceptor1"/>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="Mystack"/>
<global-results >
<result name = "fail" type = "redirect">/login.jsp</result>
</global-results>
<action name = "log*" class = "com.acion.LoginAction" method = "log{1}">
<result name = "success" >/log{1}.jsp</result>
</action>
<action name = "adduser" class = "com.acion.UserAction" method = "execute">
<result name = "success" >/adduser.jsp</result>
</action>
</package>
2、其中包中的个别Action又不希望被拦截,譬如:登陆,注册等等。两种解决方案。
(1)、将这些功能直接放入jsp页面不使用Action 注意:不要轻易暴露实际操作性的jsp地址
(2)、将这些不需要拦截的Action放入另外的一个包中,或者使用方法拦截
三)、方法拦截
如果Action中有很多方法,拦截器默认将这些方法全部拦截掉,而有时候不需要全部拦截掉,此时需要方法拦截器。
(1)定义拦截器:继承MethodFilterInterceptor类
package com.interceptor;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
public class InterceptorDemo3 extends MethodFilterInterceptor {
@Override
protected String doIntercept(ActionInvocation invocation) throws Exception {
// TODO Auto-generated method stub
System.out.println("执行拦截");
return invocation.invoke();
}
}
(2)配置struts.xml文件
<package name = "default" namespace = "/" extends = "struts-default"> <interceptors> <interceptor name="interceptor3" class="com.interceptor.InterceptorDemo3"/> </interceptors> <action name = "log*" class = "com.acion.LoginAction" method = "log{1}"> <result name = "success" >/log{1}.jsp</result> </action> <action name = "*user" class = "com.acion.UserAction" method = "{1}"> <result name = "success" >/{1}user.jsp</result> <interceptor-ref name="interceptor3"> <param name="includeMethods">add,edit</param> </interceptor-ref> <interceptor-ref name="defaultStack"/> </action> </package> 第二种:
<interceptor-ref name="interceptor3"> <param name="includeMethods">add,edit</param> </interceptor-ref>