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

 

posted @ 2017-10-21 19:13  彭艳  阅读(254)  评论(0编辑  收藏  举报