Struts2整理-----Struts2拦截器

 

struts2的拦截器是struts2的核心,其底层实现使用了Java的反射机制与动态代理。

实现struts2拦截器的方法

1.实现Interceptor接口,实现init(),destory(),intercept()方法。

2.继承AbstractInterceptor类,重写intercept()方法.

3.继承MethodFilterInterceptor类,重写doIntercept()方法

拦截器实现原理:

当请求struts2的action时,strus2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表,最后一个一个地调用列表中的拦截 

拦截器和过滤器比较

1、拦截器是基于java的反射机制的,而过滤器是基于函数回调

2、过滤器依赖与servlet容器,而拦截器不依赖与servlet容器

3、拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用

4、拦截器可以访问action上下文、值栈里的对象,而过滤器不能

5、在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次

 

新建一个案例

新建Action

package com.aaron.action;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class UserAction extends ActionSupport {

    private static final long serialVersionUID = 1L;
    private String name;

    // 用户登录
    public String login() {
        return SUCCESS;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

写一个过滤器

package com.aaron.action;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.StrutsStatics;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class AuthorityInterceptor extends AbstractInterceptor {
    private static final long serialVersionUID = 1L;
    // 拦截Action处理的拦截方法
    public String intercept(ActionInvocation invocation) throws Exception {
        System.out.println("进入拦截器》》》》》》》");
        ActionContext ac=invocation.getInvocationContext();
        //struts2 拦截器Interceptor中取得request
        HttpServletRequest request=(HttpServletRequest) ac.get(StrutsStatics.HTTP_REQUEST);
        // 取出名为user的Session属性
        String name = request.getParameter("name");
        try{
            System.out.println("得到的用户名是:  "+name);
        }catch(Exception ex){
            System.out.println("异常: "+ex.toString());
        }
        // 如果没有登陆,或者登陆所用的用户名不是aaron,都返回重新登陆
        if (name != null && name.equals("aaron")) {
            request.getSession().setAttribute("msg", "登录成功");
            request.getSession().setAttribute("name", name);
            return invocation.invoke();
        }
        //ctx.put("msg", "没有权限,重新登录");
        request.getSession().setAttribute("msg", "没有权限,重新登录");
        
        // 直接返回login的逻辑视图
        return Action.LOGIN;
    }
} 

这里直接判断用户名是否符合要求。

PS:struts2 拦截器Interceptor中取得request: HttpServletRequest request = (HttpServletRequest) ac.get(StrutsStatics.HTTP_REQUEST);


配置struts.xml文件

 

<?xml version="1.0"?>
            <!DOCTYPE struts PUBLIC 
 "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 
 "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>

    <constant name="struts.i18n.reload" value="false" />
    <constant name="struts.devMode" value="false" />

    <package name="default" extends="struts-default" namespace="/">
        <!-- 用户拦截器定义在该元素下 -->
        <interceptors>
            <!-- 定义了一个名为checkUserLogin的拦截器 -->
            <interceptor name="checkUserLogin" class="com.aaron.action.AuthorityInterceptor" />
            <interceptor-stack name="checkUserLogin_stack">
                <!-- 应用默认拦截器堆栈 一定要有 -->
                <interceptor-ref name="defaultStack" />
                <!-- 应用自定义拦截器 -->
                <interceptor-ref name="checkUserLogin" />
            </interceptor-stack>
        </interceptors>
        <!-- 定义默认拦截器 -->
        <default-interceptor-ref name="checkUserLogin" />
        <!-- 定义全局处理结果 -->
        <global-results>
            <result name="login">login.jsp</result>
        </global-results>
        <action name="login" class="com.aaron.action.UserAction"
            method="login">
            <result name="success">success.jsp</result>
            <result name="login">login.jsp</result>
        </action>

    </package>

</struts>

测试

除了aaron用户名可以登录,输入其他用户名显示的都是“没有权限,重新登录”。

 

posted @ 2016-01-12 17:59  Aaron殇醉月  阅读(197)  评论(0编辑  收藏  举报