2014-01-08 3 views
4

Наше приложение требует, чтобы пользователи вошли в систему для просмотра любого контента. Доступ ко всем страницам перехвачен LoginInterceptor, который вызывает форму входа в систему, если для пользователя нет действительного сеанса. Я хотел бы, чтобы перехватчик запоминал исходный URI запроса перед отображением формы входа и перенаправлял его, если проверка формы входа прошла успешно. Я попытался следовать Struts 2 Redirect to correct action after authentication interceptor.Struts2 перенаправление с перехватчика входа

@Service 
@Results({ 
    @Result(name = "redirect", type = "redirect", location = "${savedUrl}") 
}) 
public class LoginInterceptor extends AbstractInterceptor { 
    //... 
    private String savedUrl; 
    //... 
    @Override 
    public final String intercept(final ActionInvocation invocation) throws Exception { 
     // ... 
     savedUrl = (String) session.getAttribute("savedUrl"); 
     // ... 
     if (processLogin(request, session)) { // validate login form 
      if (!StringUtils.isEmpty(savedUrl)) { 
       return "redirect"; 
      } 
      return LOGIN_SUCCESS_RESULT; 
     } 
     // if there's no loginData in sesssion, remeber the URI and display a login form 
     String queryString = request.getQueryString(); 
     session.setAttribute("savedUrl", request.getRequestURI() + (queryString==null ? "" : ("?" + queryString))); 
     return "login"; 
    } 
    // ... 
    public String getSavedUrl(){ 
     return savedUrl; 
    } 
} 

Однако я получаю пустую страницу в результате return "redirect". getSavedUrl() никогда не называется.

Решение: поцарапать аннотацию @Results полностью и вместо return "redirect"; вызова response.sendRedirect(savedUrl); return null;

+0

Предоставляет ли ваш перехватчик возможность пройти проверку не прошедшей проверку? –

+0

Нет, это не так, если вы не вошли в систему (нет сеанса), вы перенаправлены в форму входа. –

ответ

3

Если не вошли в систему перенаправления на LOGIN результат. Затем вы должны переписать свой перехватчик примерно как

public final String intercept(final ActionInvocation invocation) throws Exception { 
    // before save original url 
    Map session = invocation.getInvocationContext().getSession(); 
    Object action = invocation.getAction(); 
    if (!(action instanceof LoginAction)){ 
    String queryString = request.getQueryString(); 
    session.put("savedUrl", request.getRequestURI()+(queryString==null?"":("?"+queryString))); 
    } else { 
    return invocation.invoke(); 
    } 

    if (!processLogin(request, session)) { //return false if not authenticated 
    session.put("isLogin", true); 
    return Action.LOGIN; 
    } else { 
     savedUrl = (String) session.get("savedUrl"); 
     boolean isLogin = (boolean)session.get("isLogin"); 
     if (!StringUtils.isEmpty(savedUrl) && isLogin) { 
      session.put("isLogin", false); 
      return "redirect"; 
     } 
     return invocation.invoke(); 
    } 
} 
+0

Что делает ваш возврат «перенаправлением»; Работа? Я не вижу никакой разницы в моей старой версии. Я думаю, что аннотация не подходит. Сотрудник нашел решение, которое я добавил к моему вопросу. –

+0

'' redirect ''является результатом и должен быть настроен на базовый класс действия или глобально (что я упоминал в ссылке выше), используя конфигурацию xml. Если вы не видите разницу, можете использовать какой-нибудь инструмент diff? –

+0

Я не могу тестировать/использовать вашу версию без внесения больших изменений в наши классы и логику. Было бы более полезно указать, почему мой исходный код не удался. Редактировать: Думаю, я понял ... Я принимаю ваш ответ. –