복붙노트

[SPRING] Spring Security 3 처음 요청한 URL 가져 오기

SPRING

Spring Security 3 처음 요청한 URL 가져 오기

사용자가 어디서 왔는지에 따라 스프링 보안 로그인 페이지를 수정해야합니다. 제 의뢰인은 두 스타일이 다른 스타일을 원합니다. appcontextroot / test vs appcontextroot /에서 선택하십시오. 나는 아래를 시도했지만 String url = savedRequest.getRedirectUrl (); 은 이미 봄 로그인 페이지와 동일하고 사용자가 요청한 초기 페이지가 아닙니다. 어떤 아이디어?

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();
    } 

해결법

  1. ==============================

    1.새 세션을 만들지 말고 세션에서 SavedRequest를 추출해야합니다.

    새 세션을 만들지 말고 세션에서 SavedRequest를 추출해야합니다.

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

    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. ==============================

    3.나는 그것이 제안 된 해결책으로 작동하게 만들지 않았고, 여기 내가 발견 한 것이있다. (스프링 3.1 사용).

    나는 그것이 제안 된 해결책으로 작동하게 만들지 않았고, 여기 내가 발견 한 것이있다. (스프링 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 등으로 끝나는 지 확인하십시오.

    또한 로그인에 실패하면 세션 속성이 이미 설정되어 있는지 확인하고 다른 경우는 특별한 경우를보아야합니다!

    Btw 내 필터는 utf-8에서 모든 입력 / 출력을 포맷하기 전에 사용되었습니다.

    그것이 도움이되기를 바랍니다.

  4. ==============================

    4.나에게 Spring Security 3.0.0을 사용했고 다음과 같은 작업을했다.

    나에게 Spring Security 3.0.0을 사용했고 다음과 같은 작업을했다.

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

  5. from https://stackoverflow.com/questions/5389274/spring-security-3-get-initially-requested-url by cc-by-sa and MIT license