Spring Security 3 Получить изначально запрошенный URL - PullRequest
14 голосов
/ 22 марта 2011

Мне нужно изменить свою страницу входа в систему безопасности в зависимости от того, откуда пришел пользователь.Мой клиент хочет разные стили между ними.Если вы пришли от appcontextroot/test против 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();
    } 

Ответы [ 4 ]

46 голосов
/ 22 марта 2011

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

SavedRequest savedRequest = 
    new HttpSessionRequestCache().getRequest(request, response);
5 голосов
/ 20 января 2013
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.

0 голосов
/ 02 мая 2016

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

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

0 голосов
/ 25 октября 2012

Я не работал с предложенным решением, вот что я нашел: (С помощью пружины 3.1).

В вашем классе фитлера:

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 и т. Д. *

Также, если ошибка входа в систему, вы должны увидеть, если атрибут сеанса уже установлен, и увидеть другие особые случаи!

Кстати, мой фильтр раньше использовался для форматирования всего ввода / вывода в utf-8.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...