Struts2 Исключение переполнения перехватчика - PullRequest
0 голосов
/ 24 августа 2011

Я работаю над модулем входа в систему для веб-приложения, использующего Struts2 + Spring + Hibernate, и хочу заставить пользователей войти в систему, если они хотят перемещаться по сайту.

У меня есть 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");

повторяется несколько раз. Я не понимаю, почему, но у меня есть еще перехватчики, и кроме этого хорошо работают другие.

Ответы [ 2 ]

3 голосов
/ 24 августа 2011

Когда ваш 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>
1 голос
/ 26 августа 2011

Почему бы вам не использовать 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/

...