-1

下面是我在 struts.xml 中定义的拦截器和全局结果

 <package name="auth_basic" extends="struts-default,tiles-default">
<interceptors>
        <interceptor name="nlogin" class="interceptors.LoginInterceptor"/>
        <interceptor-stack name="loginStack">
            <interceptor-ref name="nlogin"/>
            <interceptor-ref name="defaultStack"/>
        </interceptor-stack>
    </interceptors>
    <default-interceptor-ref name="loginStack"/>
    <global-results>
        <result name="login" type="redirectAction">gotostart</result>
        <result name="input" type="redirectAction">gotostart</result>
    </global-results>
.
.
.
</package>

上面的配置工作正常,但是当我使用结果chain而不是redirectAction它时,它会给出 java.lang.StackOverflowError

此外,当我使用tiles而不是链时,它也会抛出 java.lang.StackOverflowError

我不能在 global-results 中使用 action-chaining 吗?

下面是我的拦截器代码。另外,我想强调结果类型 redirectAction 工作正常,只有瓷砖和链会产生问题。

public String intercept(ActionInvocation ai) throws Exception {
    try {
        if (ai.getInvocationContext().getSession().get("user") == null) {
            System.out.println("Session Expired/Invalid");
            Object action = ai.getAction();
            if (action instanceof ValidationAware) {
                ((ValidationAware) action).addActionError("Unauthorized access. Please Login first");
            }
            return "login";
        }
        return ai.invoke();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return ai.invoke();
}

edited to include more code from struts.xml

 <package name="default" extends="struts-default,tiles-default,json-default">
    <default-action-ref name="gotostart"/>
    <global-results>
        <result name="input" type="tiles">tiles-home</result>
    </global-results>
<action name="gotostart" class="actions.IndexAction" method="start">
        <result name="success" type="tiles">tiles-home</result>
        <result name="input" type="tiles">tiles-home</result>
    </action>
</package>
4

1 回答 1

1

好的,我知道了。

如果未登录,您将返回一个全局结果,loginchain结果类型,然后是对另一个操作的调用。

结果login类型位于包含nLogin Interceptor.

这意味着当您尝试链接login结果时,您会在 AGAIN 内部传递 AGAIN nLogin Interceptor,再次检查是否user为空,并login在无限循环中返回结果。

你可以:

返回一个 JSP 而不是链接到另一个 Action,如下所示:

<result name="login">myLogin.jsp</result>

或将全局结果移到login自定义拦截器堆栈范围之外(例如,将其放在父包中的默认堆栈下),如下所示:

<struts>
   <package name="defaultPackage" extends="struts-default" >

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

      <global-results>
         <result name="login" type="chain">
            <param name="actionName">myLoginAction</param>
         </result>
      </global-results>

   </package>

   <package name="myLoginProtectedPackage" extends="defaultPackage">

      <interceptors>
         <interceptor name="nlogin" class="interceptors.LoginInterceptor"/>
         <interceptor-stack name="loginStack">
            <interceptor-ref name="nlogin"/>
            <interceptor-ref name="defaultStack"/>
         </interceptor-stack>
      </interceptors>

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

      <global-results>
        <result name="input" type="chain">
            <param name="actionName">myLoginAction</param>
        </result>
      </global-results>    

      <action name="myLoginAction" class="...">
         <result>myLogin.jsp</result>             
      </action>

   </package>
</struts>

不要问我为什么使用 redirectAction 有效......它应该是相同的,但可能是由于它们的不同行为。

请注意,根据指南

通常,不建议使用动作链。首先探索其他选项,例如 Redirect After Post 技术。

于 2013-01-02T17:44:34.387 回答