Наше приложение требует, чтобы пользователи вошли в систему для просмотра любого контента. Доступ ко всем страницам перехвачен 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;
Предоставляет ли ваш перехватчик возможность пройти проверку не прошедшей проверку? –
Нет, это не так, если вы не вошли в систему (нет сеанса), вы перенаправлены в форму входа. –