【问题标题】:The page is not redirecting properly by interceptor in Struts 2Struts 2 中的拦截器无法正确重定向页面
【发布时间】:2015-08-31 08:28:23
【问题描述】:

就是这样,我编写了一个拦截器登录,结果是

<result name="login" type="redirectAction">access</result>

一切正常,但我认为这是回忆它,结果去访问并再次执行拦截器和去访问等。我相信因为我的浏览器显示消息:

页面未正确重定向。

我正在使用 Struts 2 和 Rest 插件。

这是我的拦截器:

@Override
public String intercept(ActionInvocation invocation) throws Exception {

    HttpSession session = ServletActionContext.getRequest().getSession(false);
    Object loginObject = session.getAttribute("login");
    boolean login = false;

    if (loginObject != null) {
        login = (Boolean) loginObject;
        if (!login) {
            return Action.LOGIN;
        } else {
            return invocation.invoke();
        }
    } else {
        return Action.LOGIN;
    }
   

【问题讨论】:

  • 好的,我知道了。我添加@InterceptorRef(value="defaultStack" 排除执行您的登录拦截器的访问权限谢谢安德里亚。
  • 很高兴有帮助。请注意,在 StackOverflow 上,您无需编辑问题的标题即可添加 SOLVED,而是需要将正确的问题标记为 ACCEPTED,并最终对每个有帮助的问题进行 UP-VOTE。

标签: java struts2 struts2-interceptors interceptorstack struts2-rest-plugin


【解决方案1】:

扩展 Roman 的评论:将会话值设置为 true 以及为什么它是多余的:

不是检查会话值的值,而是检查它的存在。注销时删除会话对象,无论是显式(如果您需要保留其他会话数据)或使会话无效。

这有一个额外的好处,就是将您的代码减少到大约这样:

public String intercept(ActionInvocation invocation) throws Exception {
    Map    session     = invocation.getInvocationContext().getSession()
    Object loginObject = session.getAttribute("login");

    if (loginObject == null) {
      return LOGIN;
    }

    return invocation.invoke();
}

关于getSession(false),通常不需要包含布尔参数,因为JSP 页面会自动创建会话,除非明确声明不这样做。

【讨论】:

  • 嗯,相关的我想说:)
  • 这不是评论,而是答案,只是忘记在带有登录拦截器的代码中添加链接。
  • @RomanC 通过“评论”,我特别指的是第一句的最后一点,即:“[...] 这是多余的”。我在解释为​​什么它是多余的。即使我同意同意你...?!
  • @DaveNewton 我知道您是出于好意这样做的,但是在这样的帖子下的特殊部分中放置了评论,我没有对 OP 的问题发表评论。跨度>
  • @RomanC “评论”也可以是包含在更大上下文中的“备注”。更新内容。
【解决方案2】:

当您从拦截器中返回 Action.LOGIN 时,将执行结果,并且由于结果的类型为 redirectAction,因此会创建另一个请求并通过拦截器堆栈进行过滤。然后执行将再次触发您的拦截器,这是不需要的结果。

您需要为access 操作排除登录拦截器的执行,例如使用默认堆栈。

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

<action name="access" class="foo.bar.actions.Access">
    <result>access.jsp</result>
    <interceptor-ref name="defaultStack" />
</action>

<action name="foobar" class="foo.bar.actions.Foobar">
    <result>foo.jsp</result>
    <result name="login" type="redirectAction">access</result>
</action>

【讨论】:

  • @SerchRac SO 上有一种机制可以指示正确、有用的答案——如果它满足您的要求,请回答这个答案。
  • 哈,绕过评论过滤器:D
【解决方案3】:

loginaccess 都没有将loginObject 设置为会话,也没有将其设置为true,这是多余的。因此,如果你为动作配置了这个拦截器,它将阻止动作的调用和执行。

【讨论】:

  • 是的,明白了。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多