Struts2 拦截器

一、如何自定义一个拦截器?

自定义一个拦截器需要三步:

  1. 自定义一个实现Interceptor接口(或者继承自AbstractInterceptor)的类。

    public class CheckLoginInterceptor extends AbstractInterceptor {
    public static final String LOGIN_KEY = "LOGIN";
    public static final String LOGIN_PAGE = "global.login";
    
    public String intercept(ActionInvocation actionInvocation) throws Exception {
        System.out.println("begin check login interceptor!");
        // 对LoginAction不做该项拦截
        Object action = actionInvocation.getAction();
        if (action instanceof LoginAction) {
            System.out.println("exit check login, because this is login action.");
            return actionInvocation.invoke();
        }
    
        // 确认Session中是否存在LOGIN
        Map session = actionInvocation.getInvocationContext().getSession();
        String login = (String) session.get(LOGIN_KEY);
        if (login != null && login.length() > 0) {
            // 存在的情况下进行后续操作。
            System.out.println("already login!");
            return actionInvocation.invoke();
        } else {
            // 否则终止后续操作,返回LOGIN
            System.out.println("no login, forward login page!");
            return LOGIN_PAGE;
        }
    }
    将上述拦截器设定为默认拦截器:
    <default-interceptor-ref name="teamwareStack"/>
    这样在后续同一个package内部的所有Action执行之前都会被login拦截。
  2. 在strutx.xml中注册上一步中定义的拦截器

    <interceptors>
        <interceptor name="login" class="com.jpleasure.teamware.util.CheckLoginInterceptor"/>
        <interceptor-ref name="login"/>
        <!-- 加入默认拦截器栈 -->       
        <interceptor-ref name="defaultStack"/>
    </interceptors>
  3. 在需要使用的Action中引用上述定义的拦截器,为了方便也可将拦截器定义为默认的拦截器,这样在不加特殊声明的情况下所有的Action都被这个拦截器拦截。

    <action name="login" class="tutorial.Login">
        <interceptor-ref name="timer"/>
        <interceptor-ref name="logger"/>
        <result name="input">login.jsp</result>
        <result name="success" type="redirect-action">/secure/home</result>
    </action>

二、需要说明的几点

  1. 可以将多个拦截器合并在一起作为一个堆栈调用,当一个拦截器堆栈被附加到一个Action的时候,要想Action执行,必须执行拦截器堆栈中的每一个拦截器。

    <interceptors>
        <interceptor name="timer" class=".."/>
        <interceptor name="logger" class=".."/>
        <interceptor-ref name="logger"/>
    </interceptors>
    
    <action name="login" class="tutuorial.Login">
        <interceptor-ref name="myStack"/>
        <result name="success" type="redirect-action">/secure/home</result>
    </action> 
  2. 设置默认拦截器

    <!--设置默认拦截器,放在interceptors标签后-->
    <default-interceptor-ref name="myStack"/>
  3. 拦截器执行的顺序按照定义的顺序执行

  4. 使用默认拦截器配置每个Action都需要的拦截器堆栈,例如:

    <action name="login" class="tutorial.Login">
        <interceptor-ref name="timer"/>
        <interceptor-ref name="logger"/>
        <interceptor-ref name="default-stack"/>
        <result name="input">login.jsp</result>
        <result type="redirect-action">/secure/home</result>
    </action>    
    
    //可以改成
    <interceptors>
            <interceptor-stack name="myStack">
                <interceptor-ref name="timer"/>
                <interceptor-ref name="logger"/>
                <interceptor-ref name="default-stack"/>
            </interceptor-stack>
    </interceptors>
    
    <default-interceptor-ref name="myStack" />
    
    <action name="login" class="tutorial.Login">
        <result name="input">login.jsp</result>
        <result type="redirect-action">/secure/home</result>
    </action>
  5. 访问request,session

    request = (HttpServletRequest) arg0.getInvocationContext().get(ServletActionContext.HTTP_REQUEST);
    session = request.getSession();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值