struts2 - 拦截器

1.在不修改action源码的基础上,对action进行增强,AOP的思想。

2.自定义拦截器

单例

(1)方式一:实现Interceptor接口

 

(2)方式二:继承AbstractInterceptor抽象类【常用】

 

定义拦截器类

在struts.xml中声明拦截器

使用拦截器

 

  如果在拦截器中没有调用invoke方法,而是直接返回一个字符串,那么会依据拦截器返回值直接匹配结果视图。如果调用了invoke方法,则拦截器的返回值没有意义。

 


 

  拦截器1 interception.invoke();  ->进入:拦截器2 ->拦截器3...->action ->结果视图

 拦截器1 return "";直接返回字符串-->结果视图

 

 多个拦截器执行顺序:

 

配置自定义拦截器:

    <!--拦截器-->
    <package name="my-default" extends="struts-default" abstract="true">
        <interceptors>
            <interceptor name="loginInterceptor" class="cn.getword.interceptor.LoginInterceptor" />
            <interceptor-stack name="my_intercept_stack">
                <interceptor-ref name="loginInterceptor" />
                <interceptor-ref name="defaultStack" />
            </interceptor-stack>
        </interceptors>

        <default-interceptor-ref name="my_intercept_stack" />

        <global-results>
            <result name="login" type="redirect">/login2</result>
        </global-results>
    </package>
    <package name="user" extends="json-default,my-default" namespace="/user">
    </package>
View Code

 

 

拦截器:

public class LoginInterceptor extends AbstractInterceptor {
    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        ActionContext context = invocation.getInvocationContext();
        HttpServletRequest request = (HttpServletRequest)context.get("com.opensymphony.xwork2.dispatcher.HttpServletRequest");
        HttpSession session = request.getSession();
        Object user = session.getAttribute("user");
        if(user == null){  //没有登录直接返回登录页面
            return "login";
        }
        //拦截器的放行
        return invocation.invoke();
    }
}
View Code

 

 

 

 

end

posted @ 2018-09-29 11:24  fight139  阅读(141)  评论(0编辑  收藏  举报