Struts2 05---拦截器

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).自定义拦截器设置不被拦截的方法:

相关文章
相关标签/搜索