Struts 2拦截器是在程序访问某个action或者action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是AOP的一种实现。
拦截器的工作方式:
Struts2拦截器围绕着Action和Result的执行而执行,当请求Struts2的Action 或返回result时,struts2会查找配置文件,并根据其配置实例化相应的拦截器对象,然后把这些对象串成一个列表,最后一个个的调用列表中的拦截器。其中Struts2的拦截器包括自带拦截器和自定义拦截器。Struts2默认18个拦截器,其他的都是自定义的。下面将通过SSH网上商城的一个实例来学习Struts2拦截器。
自定义拦截器:
后台权限校验拦截器:可以对Action的访问进行拦截,对没有登陆的用户进行拦截,判断的时候就判断session中是否保存了用户的信息。
自定义一个拦截器需要三步:
1 自定义一个实现Interceptor接口的类。
2 在strutx.xml中注册上一步中定义的拦截器。
3 在需要使用的Action中引用上述定义的拦截器
(1)首先创建一个包,命名为interceptor
(2)新建一个类,命名为PrivilegeInterceptor
(3)在PrivilegeInterceptor开始编写代码:对没有登陆的用户进行拦截,并跳转到后台登陆的界面。如何判断用户是否登陆,判断session中是否保存了后台用户的信息,如果有,则说明登陆了,反之,没有登陆。
* 编写一个类实现Interceptor接口.或者继承Interceptor的子类.
<strong><span style="font-size:18px;">package cn.itcast.shop.interceptor; import org.apache.struts2.ServletActionContext; import cn.itcast.shop.adminuser.vo.AdminUser; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor; /** * 后台权限的拦截器 * 对没有登陆的用户,不可进行访问 * @author CXC * */ public class PrivilegeInterceptor extends MethodFilterInterceptor{ @Override //执行拦截的方法: protected String doIntercept(ActionInvocation actionInvocation) throws Exception { // 判断session中是否保存了后台用户的信息 AdminUser existAdminUser=(AdminUser) ServletActionContext.getRequest().getSession().getAttribute("existAdminUser"); if(existAdminUser == null){ //没有登陆进行访问 ActionSupport actionSupport=(ActionSupport) actionInvocation.getAction(); actionSupport.addActionError("亲,您还没有登陆!没有权限访问!"); return "loginFail"; }else{ //已经登陆过 return actionInvocation.invoke(); } } } </span></strong>(4)在struts 2中编写代码:定义拦截器:
<strong><span style="font-size:18px;"><!-- 配置自定义拦截器 --> <interceptors> <interceptor name="privilegeInterceptor" class="cn.itcast.shop.interceptor.PrivilegeInterceptor"/> </interceptors></span></strong>
(5)在需要添加拦截的地方引用拦截器或拦截器栈即可,应用拦截器,在后台action中除了后台登陆的action中都需要添加,对拦截器进行配置。
达到的效果:
总结:
Struts2拦截器可以说相当于是个过滤器:就是把不想要的或不想显示的内容给过滤掉。拦截器可以抽象出一部分代码可以用来完善原来的action,同时可以减轻代码冗余,提高重用率。