1、Struts2拦截器原理:java
Struts2拦截器的实现原理相对简单,使用了aop思想和责任链模式,当请求struts2的action时,Struts 2会查找配置文件,并根据其配置实例化相对的拦截器对象,而后串成一个列表,最后一个一个地调用列表中的拦截器。apache
1).aop思想:面向切面编程(在不修改源代码的状况下进行功能的扩展)。编程
2).责任链模式:执行多个拦截器,一个一个的进行执行,在执行完后进入下一个拦截器以前,前一个的拦截器会作相似于放行的操做。服务器
2、Struts2 拦截器接口实现:session
Struts2规定用户自定义拦截器须要实现Interceptor接口。该接口声明了3个方法:jsp
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类:ide
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; } } }
3、struts.xml拦截器详细配置:spa
3):系统默认拦截器:code
2):自定义拦截器:xml
详细配置文件以下:
<?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).自定义拦截器设置不被拦截的方法: