首页 > 解决方案 > 拦截器:actionInvocation.invoke() 不返回,但也跳转到视图

问题描述

我用struts2搭建了一个登录平台。我使用一个拦截器扩展 MethodFilterInterceptor。在方法 doIntercept 中,我使用“actionInvocation.invoke()”而不是“return actionInvocation.invoke()”。但它也运行。

struts-2.5.18

public class loginInterceptor extends MethodFilterInterceptor {
    @Override
    protected String doIntercept(ActionInvocation actionInvocation) throws Exception {
        if (ServletActionContext.getRequest().getSession().getAttribute("user") != null){
            actionInvocation.invoke();
        }
        return null;
    }
}

我认为因为该方法返回null,所以它不应该跳转到视图。但是,确实如此。

标签: javastruts2struts2-interceptors

解决方案


请参阅“编写拦截器”文档

重要的部分:

[...]invoke将在调用结果返回(例如,在您的 JSP 被渲染后),使其非常适合诸如 open-session-in-view 模式之类的事情。如果你想在结果被调用之前做一些事情,你应该实现一个 PreResultListener。

即,如果您调用invoke,拦截器和操作将正常执行。

短路正常处理不要调用invoke而是返回适合您目的的结果,例如登录页面的全局结果。


推荐阅读