欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Struts2--拦截器

程序员文章站 2022-07-09 17:15:31
...

1 action拦截器
拦截器整体流程:
Struts2--拦截器
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 中,将会被拦截,

相关标签: 拦截器 struts2