1 action拦截器
拦截器整体流程:
1.1 基于配置文件方式配置拦截器
请求到达后台后,可以通过配置执行方法的拦截器来达到比如权限控制,日志一系列功能。
写一个Demo,来计算一个处理请求使用了多长时间。
请求处理类及方法:
public class HelloAction {
public String execute(){
System.out.println("execute");
return Action.SUCCESS;
}
}
自定义拦截器:
<struts>
<package name="default" extends="struts-default" namespace="/">
<!-- 配置拦截器 -->
<interceptors>
<!-- 配置拦截器 -->
<interceptor name="time" class="cn.sxt.interceptor.TimeInterceptor"></interceptor>
</interceptors>
<action name="hello" class="cn.sxt.action.HelloAction">
<result>/hello.jsp</result>
<!-- 引用拦截器,将拦截器和action关联-->
<interceptor-ref name="time"/>
</action>
</package>
</struts>
struts.xml配置文件:
<struts>
<package name="default" extends="struts-default" namespace="/">
<!-- 配置拦截器 -->
<interceptors>
<!-- 配置拦截器 -->
<interceptor name="time" class="cn.sxt.interceptor.TimeInterceptor"></interceptor>
</interceptors>
<action name="hello" class="cn.sxt.action.HelloAction">
<result>/hello.jsp</result>
<!-- 引用拦截器,将拦截器和action关联-->
<interceptor-ref name="time"/>
</action>
</package>
</struts>
将action和拦截器关联。
可以配置一个拦截器栈:
<struts>
<package name="default" extends="struts-default" namespace="/">
<!-- 配置拦截器 -->
<interceptors>
<!-- 依次配置拦截器 -->
<interceptor name="time" class="cn.sxt.interceptor.TimeInterceptor"></interceptor>
<!-- 定义一个拦截器栈 ,可以包含多个拦截器的引用,栈的引用和拦截器一致-->
<interceptor-stack name="myStack">
<interceptor-ref name="time"/>
<!-- 引入默认的拦截器栈 -->
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
</interceptors>
<!-- 将定义的栈设置为默认的拦截器-->
<default-interceptor-ref name="myStack"/>
<action name="hello" class="cn.sxt.action.HelloAction">
<result>/hello.jsp</result>
<interceptor-ref name="myStack"/>
</action>
</package>
</struts>
1.2 基于注解方式的拦截器
package com.example.actions;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Actions;
@InterceptorRefs({
@InterceptorRef("interceptor-1"),
@InterceptorRef("defaultStack")
})
public class HelloWorld extends ActionSupport {
@Action(value="action1", interceptorRefs=@InterceptorRef("validation"))
public String execute() {
return SUCCESS;
}
@Action(value="action2")
public String doSomething() {
return SUCCESS;
}
}
2 方法拦截器
自定义方法拦截器需要继承MethodFilterInterceptor,重写doIntercept()方法。
自定义方法拦截器:
//方法拦截器
public class ListInterceptor extends MethodFilterInterceptor{
@Override
protected String doIntercept(ActionInvocation invocation) throws Exception {
// TODO Auto-generated method stub
System.out.println("方法拦截器被执行");
return invocation.invoke();
}
}
两个测试请求类:
public class HelloAction {
public String add(){
System.out.println("add");
return Action.SUCCESS;
}
}
public class LoginAction {
public String login() {
System.out.println("login");
return Action.SUCCESS;
}
}
struts.xml配置
<struts>
<package name="default" extends="struts-default" namespace="/">
<!-- 配置拦截器 -->
<interceptors>
<!-- 依次配置拦截器 -->
<interceptor name="methodInterceptor" class="cn.sxt.interceptor.ListInterceptor"></interceptor>
<!-- 定义一个拦截器栈 ,可以包含多个拦截器的引用,栈的引用和拦截器一致-->
<interceptor-stack name="myStack">
<interceptor-ref name="methodInterceptor">
<!-- 配置被拦截的方法,中间用,号隔开。 -->
<param name="includeMethods">add</param>
<!-- 配置不被拦截的方法 -->
<param name="excludeMethods">login</param>
</interceptor-ref>
<!-- 引入默认的拦截器-->
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
</interceptors>
<!-- 定义默认的拦截器/栈 -->
<default-interceptor-ref name="myStack"/>
<action name="add" class="cn.sxt.action.HelloAction" method="add">
<result name="success">/success.jsp</result>
</action>
<action name="login" class="cn.sxt.action.LoginAction" method="login">
<result name="success">/success.jsp</result>
</action>
</package>
</struts>
当执行add方法时拦截,执行,执行login方法时不拦截。如果一个方法配置在excludeMethods,同时又配置在includeMethods 中,将会被拦截,