Struts2--拦截器

1 action拦截器
拦截器整体流程:
这里写图片描述
1.1 基于配置文件方式配置拦截器
请求到达后台后,可以通过配置执行方法的拦截器来达到比如权限控制,日志一系列功能。
写一个Demo,来计算一个处理请求使用了多长时间。
请求处理类及方法:

public class HelloAction {
    public String execute(){
        System.out.println("execute");
        return Action.SUCCESS;
    }
}

自定义拦截器:

<struts>
    <package name="default" extends="struts-default" namespace="/">
<!--    配置拦截器 -->
        <interceptors>
<!--            配置拦截器 -->
            <interceptor name="time" class="cn.sxt.interceptor.TimeInterceptor"></interceptor>
        </interceptors>
        <action name="hello" class="cn.sxt.action.HelloAction">
            <result>/hello.jsp</result>
<!--            引用拦截器,将拦截器和action关联-->
            <interceptor-ref name="time"/> 
        </action>
    </package>
</struts>

struts.xml配置文件:

<struts>
    <package name="default" extends="struts-default" namespace="/">
<!--    配置拦截器 -->
        <interceptors>
<!--            配置拦截器 -->
            <interceptor name="time" class="cn.sxt.interceptor.TimeInterceptor"></interceptor>
        </interceptors>
        <action name="hello" class="cn.sxt.action.HelloAction">
            <result>/hello.jsp</result>
<!--            引用拦截器,将拦截器和action关联-->
            <interceptor-ref name="time"/> 
        </action>
    </package>
</struts>

将action和拦截器关联。
可以配置一个拦截器栈:

<struts>
    <package name="default" extends="struts-default" namespace="/">
<!--    配置拦截器 -->
        <interceptors>
<!--            依次配置拦截器 -->
            <interceptor name="time" class="cn.sxt.interceptor.TimeInterceptor"></interceptor>
<!--            定义一个拦截器栈 ,可以包含多个拦截器的引用,栈的引用和拦截器一致-->
            <interceptor-stack name="myStack">
                <interceptor-ref name="time"/> 
                <!-- 引入默认的拦截器栈 -->
                <interceptor-ref name="defaultStack"/>
            </interceptor-stack>
        </interceptors>
        <!-- 将定义的栈设置为默认的拦截器-->
        <default-interceptor-ref name="myStack"/>
        <action name="hello" class="cn.sxt.action.HelloAction">
            <result>/hello.jsp</result>
            <interceptor-ref name="myStack"/>
        </action>
    </package>
</struts>

1.2 基于注解方式的拦截器

package com.example.actions;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Actions;

@InterceptorRefs({
    @InterceptorRef("interceptor-1"),
    @InterceptorRef("defaultStack")
})
public class HelloWorld extends ActionSupport {
  @Action(value="action1", interceptorRefs=@InterceptorRef("validation"))
  public String execute() {
    return SUCCESS;
  }

  @Action(value="action2")
  public String doSomething() {
    return SUCCESS;
  }
}

2 方法拦截器
自定义方法拦截器需要继承MethodFilterInterceptor,重写doIntercept()方法。
自定义方法拦截器:

//方法拦截器
public class ListInterceptor extends MethodFilterInterceptor{

    @Override
    protected String doIntercept(ActionInvocation invocation) throws Exception {
        // TODO Auto-generated method stub
        System.out.println("方法拦截器被执行");
        return invocation.invoke();
    }
}

两个测试请求类:

public class HelloAction {
    public String add(){
        System.out.println("add");
        return Action.SUCCESS;
    }
}
public class LoginAction {
    public String login() {
        System.out.println("login");
        return Action.SUCCESS;
    }
}

struts.xml配置

<struts>
    <package name="default" extends="struts-default" namespace="/">
<!--    配置拦截器 -->
        <interceptors>
<!--            依次配置拦截器 -->
            <interceptor name="methodInterceptor" class="cn.sxt.interceptor.ListInterceptor"></interceptor>

<!--            定义一个拦截器栈 ,可以包含多个拦截器的引用,栈的引用和拦截器一致-->
            <interceptor-stack name="myStack">
                <interceptor-ref name="methodInterceptor">
<!--                    配置被拦截的方法,中间用,号隔开。 -->
                    <param name="includeMethods">add</param>
<!--                    配置不被拦截的方法 -->
                    <param name="excludeMethods">login</param>
                </interceptor-ref>  
<!--            引入默认的拦截器-->
                <interceptor-ref name="defaultStack"/>
            </interceptor-stack>
        </interceptors>

<!--        定义默认的拦截器/栈 -->
        <default-interceptor-ref name="myStack"/>

        <action name="add" class="cn.sxt.action.HelloAction" method="add">
            <result name="success">/success.jsp</result>
        </action>

        <action name="login" class="cn.sxt.action.LoginAction" method="login">
            <result name="success">/success.jsp</result>
        </action>
    </package>
</struts>

当执行add方法时拦截,执行,执行login方法时不拦截。如果一个方法配置在excludeMethods,同时又配置在includeMethods 中,将会被拦截,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值