Struts2 05---拦截器
一、Struts2拦截器原理:
Struts2拦截器的实现原理相对简单,使用了aop思想和责任链模式,当请求struts2的action时,Struts 2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表,最后一个一个地调用列表中的拦截器。
1).aop思想:面向切面编程(在不修改源代码的情况下进行功能的扩展)。
2).责任链模式:执行多个拦截器,一个一个的进行执行,在执行完后进入下一个拦截器之前,前一个的拦截器会做类似于放行的操作。
二、Struts2 拦截器接口实现:
Struts2规定用户自定义拦截器需要实现Interceptor接口。该接口声明了3个方法:
package com.action; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.Interceptor; public class MyInterceptor implements Interceptor{ //结束:当拦截器销毁时执行的方法; @Override public void destroy() { } //初始化 :在服务器起动的时候加载一次,并且只加载一次; @Override public void init() { } //放行 :如果满足要求继续往下执行调用invoke方法,否则自定义返回信息 @Override public String intercept(ActionInvocation arg0) throws Exception {
//是如果只有一个拦截器执行完这个方法后,会返回给视图,如果有多个拦截器,它顺序的执行完所有的拦截器,才返回给视图,也就是调用后面的action继续执行。 arg0.invoke(); return null; } }
但是,这个接口需要实现三个方法,其中的init().destroy()是系统默认执行的,我们不需要管它,所以,在我们写拦截器的时候,还可以选择继承MethodFilterInterceptor类:
package com.zking.interceptor; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.Action; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor; public class LoginInterceptor extends MethodFilterInterceptor{ @Override protected String doIntercept(ActionInvocation actionInvocation) throws Exception { //拦截器所需要执行的业务逻辑 HttpServletRequest request=ServletActionContext.getRequest(); String name=(String)request.getSession().getAttribute("login"); if(name!=null){ //成功则继续执行 actionInvocation.invoke(); return Action.SUCCESS; } else{ //失败则返回信息给struts.xml return Action.ERROR; } } }
三、struts.xml拦截器详细配置:
3):系统默认拦截器:
2):自定义拦截器:
详细配置文件如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <!-- 默认拦截器 --> <package name="mypackage" extends="struts-default"> <action name="login" class="com.action.LoginAction"> <!-- 配置令牌 --> <interceptor-ref name="token"></interceptor-ref> <!-- 引入默认的拦截器 默认的拦截器会帮你把action转换到action类中 --> <interceptor-ref name="defaultStack"></interceptor-ref> <result name="success">/success.jsp</result> <!-- 当在session中已经找到相同的值得时候,进行跳转 --> <result name="invalid.token">/error.jsp</result> </action> </package> <!-- 自定义拦截器 --> <package name="mylogin" extends="struts-default"> <!-- 创建拦截器 --> <interceptors> <interceptor name="MyInterceptor" class="com.zking.interceptor.MyInterceptor"></interceptor> </interceptors> <action name="userlogin" class="com.action.LoginActionInterceptor" method="login"> <!-- 引用拦截器 --> <interceptor-ref name="MyInterceptor"> <param name="excludeMethods">login</param> </interceptor-ref> <result name="success">/success.jsp</result> <result name="login">/loginInterceptor.jsp</result> </action> </package>
3).自定义拦截器设置不被拦截的方法: