Struts2的拦截器类是用来拦截用户请求,处理之后,然后在给Action处理。在Struts2上配置一个自定义拦截器方法如下:
1:用户自定义拦截器,自定义拦截器必须实现com.opensymphony.xwork2.interceptor接口,或者继承AbstractInterceptor 类,假设我对一个login.jsp进行拦截(拦截里面的username,password)。具体代码如下:
public class UserInterceptor extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation arg0) throws Exception {
// TODO Auto-generated method stub
System.out.println("开始调用拦截器");
ActionContext ac =argo.getInvocationContext();
Map<String,Object> session = ac.getSession();
if ( session.get("username")==null) {
return "login";
}else{
return arg0.invoke();
}
}
}
注意:这里的arg0.invoke是在action之前实现的代码 ,如果你需要拦截器在action之后实现功能,可以把arg0.invoke() 提前。
2:在Struts.xml进行自定义拦截器 ,具体代码如下:
<interceptors>
<interceptor name="UserInterceptor" class="com.interceptor.UserInterceptor" ></interceptor>
</interceptors>
3:struts.xml里面的action种使用拦截器。
<action name="*_*" class="com.action.{1}Action" method="{2}" >
<result name="login" type="redirect" >/Page_index.jsp</result>
<result name="list" type="redirect">/list.jsp</result>
<interceptor-ref name="defaultStack" ></interceptor-ref>
<interceptor-ref name="UserInterceptor" ></interceptor-ref>
</action>
注意:这里的默认拦截器必须填写,否则得不到session里的值,session会是一个空值,如果加了默认配置还是空值的话,试着把拦截器配置注释掉,运行后在解除注释。
如果需要配置多个拦截器的话,可以在interceptors内写多个interceptor 标记,也可以在interceptor标记中间添加参数,用来定义参数,参数标记是param ,比如:
<interceptors-stack name="拦截器栈名1">
<interceptor name="UserInterceptor" class="com.interceptor.UserInterceptor" ></interceptor>
<interceptor name="拦截器名1" class="拦截器类1" >
<param name="参数名1"> 参数值1</param>
<param name="参数名2" >参数值2</param>
</interceptor>
<interceptor name="拦截器名2" class="拦截器类2" ></interceptor>
</interceptors-stack>
默认的情况下,拦截器会拦截action里面的所有方法,如果想拦截固定方法,或者过滤固定方法,可以如下设置:
1用户自定义拦截器
public class FilterHelloInterceptor extends MethodFilterInterceptor {
@Override
protected String doIntercept(ActionInvocation arg0) throws Exception {
System.out.println("方法都是一样的,名字不同而已");
return arg0.invoke();
}
}
2struts.xml 设置拦截器:
<interceptors >
<interceptor name="UserInterceptor " class="" ></interceptor>
</interceptors>
3action里面配置
<interceptor-ref name="UserInterceptor" >
<param name="excludeMethods"> execute,aa,bb</param>
excludeMethods表示排除过滤的方法,拦截的方法是execute ,如果有多个则用,隔开,比如aa,bb
</interceptor-ref>
<interceptor-ref name="" >
<param name="includeMethods" >execute,aa,bb </param>
includeMethods表示要对方法进行拦截,拦截的方法是execute ,如果有多个则用,隔开,比如aa,bb
</interceptor>