【问题标题】:Struts2 Interceptor overflow exceptionStruts2 拦截器溢出异常
【发布时间】:2011-08-24 13:13:14
【问题描述】:

我正在使用 Struts2 + Spring + Hibernate 为 Web 应用程序开发登录模块,如果用户想要浏览网站,我想强制用户登录。

我有一个 LoginInterceptor

public class LoginInterceptor implements Interceptor {

public LoginInterceptor() {
}

public void destroy() {
    System.out.println("LoginInterceptor destroy() is called...");
}

public void init() {
    System.out.println("LoginInterceptor init() is called...");
}

public String intercept(ActionInvocation actionInvocation) throws Exception {

    final ActionContext context = actionInvocation.getInvocationContext();
    HttpServletRequest request = (HttpServletRequest) context.get(ServletActionContext.HTTP_REQUEST);
    HttpSession session = request.getSession(true);

    //Code

    try {

        Users userObj = (Users) session.getAttribute("userObj");

        if (userObj == null) {
            System.out.println("if from LoginInterceptor");
            return "noLogin";
        }

    } catch (Exception e) {
        Logger.getLogger(LoginInterceptor.class.getName()).log(Level.INFO, "message", e);
    }

    //Invoke action
    String result = actionInvocation.invoke();

    return result;
}
}

我的 struts.xml

 <interceptors>

        <interceptor name="myLocale" class="com.deveto.struts.interceptors.LocaleInterceptor"/>
        <interceptor name="login" class="com.deveto.struts.interceptors.LoginInterceptor"/>
        <interceptor name="access" class="com.deveto.struts.interceptors.AccessInterceptor"/>

        <interceptor-stack name="defaultStack">
            <interceptor-ref name="myLocale"/>
            <interceptor-ref name="login"/>
            <interceptor-ref name="exception"/>
            <interceptor-ref name="alias"/>
            <interceptor-ref name="prepare"/>
            <interceptor-ref name="i18n"/>
            <interceptor-ref name="chain"/>
            <interceptor-ref name="debugging"/>
            <interceptor-ref name="profiling"/>
            <interceptor-ref name="fileUpload"/>
            <interceptor-ref name="checkbox"/>
            <interceptor-ref name="params">
                <param name="excludeParams">dojo\..*</param>
            </interceptor-ref>
            <interceptor-ref name="conversionError"/>
            <interceptor-ref name="validation">
                <param name="excludeMethods">input,back,cancel,browse</param>
            </interceptor-ref>
            <interceptor-ref name="workflow">
                <param name="excludeMethods">input,back,cancel,browse</param>
            </interceptor-ref>
        </interceptor-stack>
    </interceptors>

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

    <global-results>
        <result name="noLogin" type="redirectAction">show-login</result>
        <result name="noAccess" type="redirectAction">access-required</result>
    </global-results>

    <action
        name="show-login"
        class="com.deveto.struts.actions.UsersAction" >
        <interceptor-ref name="defaultStack"/>
        <result name="success" type="tiles">tiles.login</result>
    </action>

但是当我运行项目时,我有一个溢出异常,在堆栈跟踪中我什么都没有,但是 Mozilla 告诉我:

      The page isn't redirecting properly  

      Firefox has detected that the server is redirecting the request for this address in a way that will never complete.

  System.out.println("if from LoginInterceptor");

重复多次。我不明白为什么,但我有更多的拦截器,除此之外其他的也很好。

【问题讨论】:

  • 您的noLogin 结果是如何定义的?我怀疑它会重定向到某个登录页面,该页面再次被您的LoginInterceptor 拦截,然后重定向......您明白了。
  • 我在第二个框中提供了代码,请向下滚动第二个框,您会得到它。
  • 对不起,我没有看到滚动条:/ 请看下面的答案。

标签: login struts2 interceptor interceptorstack


【解决方案1】:

当您的LoginInterceptor 返回其noLogin 结果时,它会重定向,这会再次被LoginInterceptor 拦截,从而将其变成无限的重定向循环。

所以你必须排除你的show-login被你的LoginInterceptor拦截,例如

定义两个拦截器堆栈,并将与LoginInterceptor设置为默认:

<interceptor-stack name="defaultStack">
  ... same as in your question ...
</interceptor-stack>

<interceptor-stack name="noLoginStack">
  ... same as in your question but *without* the LoginInterceptor ...
</interceptor-stack>

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

然后仅对于 show-login 操作,使用 noLoginStack

<action name="show-login"
    ... >
    <interceptor-ref name="noLoginStack"/>
    ...
</action>

【讨论】:

  • 好的,我做了这个,但是我得到了同样的结果,即使我把动作没有任何拦截器堆栈,仍然是同样的错误
  • 我刚刚使用您的确切 LoginInterceptor、一个最小的 struts.xml(使用我上面建议的拦截器堆栈)和两个操作:“secret”和“show-login”(每个都只是结果)在本地检查了它在 HTML 简单页面中)--- 如果我尝试访问 myhost/myapp/secret,我会重定向一次到 myhost/myapp/show-login.action,然后停止。你确定你的其他拦截器/代码都没有做某事吗?
  • 我制作了一个新应用程序,并对其进行了测试,同样的成功结果,但在我的旧应用程序中却出现了错误。很奇怪,我需要对所有源代码进行注释,并尝试对每个操作进行部分测试。感谢您的提示
【解决方案2】:

你为什么不直接使用 Spring Security 来做到这一点? 它的配置非常简单,并且可以与 Struts2 完美配合。 从那里开始:http://static.springsource.org/spring-security/site/tutorial.html 或那里:http://www.mularien.com/blog/2008/07/07/5-minute-guide-to-spring-security/

【讨论】:

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