Ответ 1
Вам нужно извлечь SavedRequest
из сеанса, а не создать новый:
SavedRequest savedRequest =
new HttpSessionRequestCache().getRequest(request, response);
Мне нужно изменить страницу входа в систему безопасности spring на основе того, откуда пришел пользователь. Мой клиент хочет, чтобы стили были разными между ними. Если вы пришли от appcontextroot/test
vs appcontextroot/choose
. Я попытался сделать ниже, но String url=savedRequest.getRedirectUrl();
уже равен странице входа spring, а не исходной странице, запрошенной пользователем. Любые идеи?
ExternalContext externalContext = FacesUtils.getExternalContext();
HttpServletRequest request = (HttpServletRequest)externalContext.getRequest();
HttpSession session = request.getSession(false);
if(session != null) {
SavedRequest savedRequest = new DefaultSavedRequest(request, new PortResolverImpl());
String url=savedRequest.getRedirectUrl();
}
Вам нужно извлечь SavedRequest
из сеанса, а не создать новый:
SavedRequest savedRequest =
new HttpSessionRequestCache().getRequest(request, response);
SavedRequest savedRequest =
(SavedRequest)session.getAttribute("SPRING_SECURITY_SAVED_REQUEST");
// ...check for null...
String targetUrl = savedRequest.getRedirectUrl();
Ужасно, но работает, если у вас нет доступного HttpServletResponse (например, если вы используете org.springframework.social.connect.web.SignInAdapter
).
Протестировано с помощью Spring Security 3.1.0.RC2.
Я не работал с предлагаемым решением, вот что я нашел: (Используя spring 3.1).
В вашем классе fitler:
CharsetFilter implements Filter {
@OVerride public void doFilter(ServletRequest request, ServletResponse response, FilterChain next) throws IOException, ServletException {
HttpServletRequest hsr = (HttpServletRequest) request;
if (hsr.getUserPrincipal() == null) {
HttpSession session = hsr.getSession();
if (!(hsr == null)) {
logger.info("path : " + hsr.getPathInfo());
session.setAttribute("beforeLoginUrl", hsr.getPathInfo());
}
}
}
Затем ваш web.xml объявит ваш фильтр:
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter>
<filter-name>charsetFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>charsetFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>CharsetFilter</filter-name>
<filter-class>com.ent.foo.CharsetFilter</filter-class>
<init-param>
<param-name>requestEncoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
Затем в URL-адресе перенаправления после успешного входа в систему просто верните HttpSession:
@RequestMapping(value = "successful")
public void showSuccessfulogin (HttpSession session) {
String redirectUrl = (String) session.getAttribute("beforeLoginUrl");
if (redirectUrl != null) {
session.removeAttribute("beforeLoginUrl");
return "redirect:" + redirectUrl;
}
return "redirect:/";
}
Здесь вы получили материал, чтобы он работал, но вам нужно проверить
hsr.getPathInfo()
и посмотреть, заканчивается ли оно с помощью .css или .js и т.д.
Кроме того, если сбой входа в систему, вы увидите, что атрибут сеанса уже установлен и см. любой другой специальный случай!
Btw мой фильтр ранее использовался для форматирования всего ввода/вывода в utf-8.
Надеюсь, это поможет любому.
Для меня я использовал Spring Security 3.0.0, и следующее работало:
DefaultSavedRequest savedRequest = (DefaultSavedRequest) request.getSession(). getAttribute ( "SPRING_SECURITY_SAVED_REQUEST_KEY" ); targetUrl = savedRequest.getRedirectUrl();