2

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

<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;
    }
   
4

3 回答 3

2

扩展 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 页面将自动创建会话,除非明确声明不这样做。

于 2015-08-31T13:56:53.417 回答
1

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

于 2015-08-31T09:10:39.773 回答
1

当您从拦截器中返回 Action.LOGIN 时,将执行结果,并且由于结果是 type 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>
于 2015-08-31T08:38:37.723 回答