2

Вот именно, я закодировать перехватчик логин, результатстраница не перенаправлять правильно перехватчик Struts2

<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; 
    } 
+0

Хорошо, я понял. Я добавляю '@InterceptorRef (value =" defaultStack "' _, чтобы исключить выполнение вашего Login Interceptor для доступа. Спасибо Andrea. – SerchRac

+0

рад, что помогло. Обратите внимание, что в StackOverflow вам не нужно редактировать заголовок вопроса, чтобы добавить SOLVED, вместо этого вам нужно ЗАКАЗАТЬ правильный вопрос, как ACCEPTED, и в конечном итоге UP-VOTE каждый вопрос, который помог. –

ответ

1

При возврате Action.LOGIN внутри перехватчик, результат выполняется, и, так как результат типа 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> 
+0

Это работает, спасибо. – SerchRac

+1

@SerchRac Есть механизм SO, чтобы указать правильные, полезные ответы - пожалуйста, дайте этот ответ, если он удовлетворяет вашим требованиям. –

+1

Ха, путь вокруг фильтра комментариев: D –

1

Ни login или access является установка loginObject на сессии, ни они устанавливают его true, который является излишним. В результате, если вы настроили этот перехватчик на действие, это предотвратит вызов и выполнение действия.

+0

Да, понял. Спасибо. – SerchRac

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), это обычно не требуется включать логическое рассуждение, так как JSP-страницы будут создавать сеансы автоматически, если явно не заявлено не.

+0

Ну, достаточно связанный я бы сказал :) –

+0

это не комментарий, а ответ, просто забыл добавить ссылку к коду с перехватчиком входа. –

+1

@RomanC «Комментарий» Я специально ссылаюсь на последний бит первого предложения, а именно: «[...], который лишний». Я объясняю, почему это лишнее. Даже когда я соглашусь с вами ...?! –

Смежные вопросы