拦截器是Struts2框架的核心内容之一,许多核心功能(避免表单重复提交,数据类型转换,数据校验,文件上传,国际化及权限管理等)都是通过拦截器实现的。
Struts2中的拦截器是面向切面编程(AOP)设计思想的实现。
拦截器的使用通常包含以下几步:
1.创建拦截器类。
拦截器类可以通过实现Interceptor接口(实现init(),destroy(),intercept()方法),也可以通过集成AbctractInterceptor类并重写intercept()方法。
package cn.bdx.intercepter; import java.util.Map; import cn.bdx.model.LoginUser; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; public class MyInterceptor1 extends AbstractInterceptor{ @Override public String intercept(ActionInvocation invocation) throws Exception { //已登录作为实例 Object action = invocation.getAction(); if(action instanceof LoginUser) { return invocation.invoke(); } Map<String,Object> session = invocation.getInvocationContext().getSession(); LoginUser loginUser = (LoginUser)session.get("loginUser"); if(loginUser != null){ return invocation.invoke(); }else { ((ActionSupport) action).addActionMessage("您还没有登录"); return "input"; } } }
2.注册拦截器
拦截器在struts2设计为可插拔的方式,即在使用对拦截器类进行注册,在不使用时直接删除掉即可
在struts.xml文件中进行配置
方式1:配置package全局的拦截器
<package name="default" namespace="/" extends="struts-default"> <interceptors> <interceptor name="login" class="cn.bdx.intercepter.MyInterceptor1"></interceptor> <interceptor-stack name="myLoginStack"> <interceptor-ref name="login"> <param name=""></param> </interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> </interceptor-stack> </interceptors> <default-interceptor-ref name="myLoginStack" /> </package>
注:interceptor标签用于配置自己的拦截器,interceptor-stack用于自定义自己的拦截器的stack,default-interceptor-ref的配置表明在这个package包中使用myLoginStack这个拦截器。
方式2:action内部的拦截器
<package name="default" namespace="/" extends="struts-default"> <interceptors> <interceptor name="login" class="cn.bdx.intercepter.MyInterceptor1"></interceptor> </interceptors> <action name="login" class="cn.bdx.controller.LoginUserController" method="login1"> <interceptor-ref name="login"></interceptor-ref> </action> </package>
注:Struts2中有许多内置的拦截器,详细内容可以查看struts-default.xml文件内容。