【问题标题】:struts2 interceptor redirecting twice to actionstruts2拦截器重定向两次动作
【发布时间】:2012-03-05 21:19:06
【问题描述】:

我有一个登录拦截器,它检查会话成员对象,如果它为空,则将其重定向到登录页面,否则继续操作。

每个动作块都有这个拦截器。问题是当你调用动作时它会命中拦截器,如果它是真的继续操作方法,然后返回“成功”或“输入”然后再次命中拦截器以重定向选定的结果名称。

如何防止两次调用拦截器?

拦截器代码:

public String intercept(ActionInvocation actionInvocation) throws Exception {
        HttpServletRequest request = (HttpServletRequest) actionInvocation.getInvocationContext().get(StrutsStatics.HTTP_REQUEST);
        HttpSession session = request.getSession();

    if (session.getAttribute("member")==null) {

        return Action.LOGIN;
    } else {
        return actionInvocation.invoke();
    }
}

struts.xml 动作视图:

    <action name="actionName" class="actionClass" method="init">
        <interceptor-ref name="loginStack"/>
        <result name="input">show.jsp</result>
    </action>

【问题讨论】:

  • 不是特定的操作。拦截器是 com.opensymphony.xwork2.interceptor.Interceptor 的简单实现类
  • 你能澄清你的担忧吗?拦截器通常被调用两次,这就是为什么它是一个拦截器堆栈。您向下钻取堆栈调用操作,然后返回堆栈。如果您正在重定向,那么它将再次被调用......但重定向通常是要避免的。整个过程非常快,所以除非有其他事情发生,否则没关系。顺便说一句,您可以说: actionInvocation.getInvocationContext().getSession() 并删除第二行。
  • @Quaternion 它们不是“调用两次”,而是调用一次,然后包装动作执行。我也不知道为什么要避免重定向;那有什么论据?
  • 我应该注意我的坏语言,当然他们被称为一次。我不清楚为什么 OP 认为他们被调用了两次,并且可能正在以某种方式跟踪执行并只是看着调用结束。我不知道我为什么这么说重定向......我不喜欢在动作级别重定向它应该在拦截器中,因为它看起来像他正在使用 xml 并且这使得意大利面条 xml(你需要跨多个动作在动作 java 和动作 xml 之间切换以弄清楚发生了什么)我可能完全错了,但我明白了......
  • ... 从行 [问题是当你调用动作时它会击中拦截器,如果它是真的继续操作方法,然后返回“成功”或“输入”然后再次击中拦截器重定向该选定的结果名称。] 这对我来说表明如果确实第二次调用拦截器,则该操作正在执行重定向,这就是我所说的重定向通常应该避免的意思(我认为工作流程是拦截器)动作用于编组数据,如果两个动作共享功能,最好通过继承或推送来显示......

标签: java redirect struts2 interceptor


【解决方案1】:

如果您重定向到一个在其引用中具有相同拦截器的结果,它当然会被调用两次。

如果您转发到此处显示的 JSP,则拦截器将不会再次被调用。


无需为每个操作都声明这一点——设置默认拦截器堆栈。对于不需要需要此堆栈的操作(如登录),为不包含此拦截器的该操作定义一个拦截器引用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-03
    • 1970-01-01
    相关资源
    最近更新 更多