页面没有正确地重定向拦截器struts2

时间:2015-08-31 08:28:24

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

那就是它,我编写一个拦截器登录,结果是

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

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

  

页面未正确重定向。

我正在使用Struts2和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;
    }

3 个答案:

答案 0 :(得分:2)

扩展罗马的评论:将会话值设置为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),通常不需要包含boolean参数,因为JSP页面将自动创建会话,除非明确声明不是。

答案 1 :(得分:1)

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

例如,您需要使用默认堆栈排除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>

答案 2 :(得分:1)

loginaccess都未将loginObject设置为会话,也未将其设置为true,这是多余的。因此,如果将此拦截器配置为该操作,则会阻止操作调用和执行。