Подтвердить что ты не робот

Spring Безопасность 3 Получите первоначально запрошенный URL

Мне нужно изменить страницу входа в систему безопасности 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();
    } 
4b9b3361

Ответ 1

Вам нужно извлечь SavedRequest из сеанса, а не создать новый:

SavedRequest savedRequest = 
    new HttpSessionRequestCache().getRequest(request, response);

Ответ 2

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.

Ответ 3

Я не работал с предлагаемым решением, вот что я нашел: (Используя 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.

Надеюсь, это поможет любому.

Ответ 4

Для меня я использовал Spring Security 3.0.0, и следующее работало:

DefaultSavedRequest savedRequest = (DefaultSavedRequest) request.getSession(). getAttribute ( "SPRING_SECURITY_SAVED_REQUEST_KEY" );       targetUrl = savedRequest.getRedirectUrl();