2011-03-22 85 views
14

我需要根據用戶來自哪裏修改我的spring安全登錄頁面。我的客戶想要兩種風格不同。如果您來自appcontextroot/test vs appcontextroot/choose。我試圖做下面的事情,但String url=savedRequest.getRedirectUrl();已經和春季登錄頁面相同,而不是用戶所要求的初始頁面。有任何想法嗎?Spring Security 3初始請求URL

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

我認爲你必須創建兩個不同的登錄頁面,並帶有相應的過濾器。 – 2011-03-22 09:48:23

+0

Alois,感謝您的迴應,您是否知道這樣做的一個例子。我是春季安全新手......謝謝! – c12 2011-03-22 09:55:40

回答

43

您需要從會議中提取SavedRequest,而不是創建一個新:

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

感謝您的回覆......我無法找到正確的密鑰。我試過request.getSession()。getAttribute(WebAttributes.SAVED_REQUEST);我正在使用spring security 3.1.0.M1 – c12 2011-03-22 09:53:43

+0

@ c12:不要手動執行,使用'HttpSessionRequestCache',如上所示。 – axtavt 2011-03-22 09:56:04

+0

感謝了,它的工作!非常感謝! – c12 2011-03-22 10:02:10

0

我沒有做它與提出的解決方案的工作,這裏是我的發現: (使用春天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:/"; 
} 

在這裏你得到的東西,使其工作,但你會h AVE檢查

hsr.getPathInfo() 

,看看它是否具有的CSS或.js文件,等結束...

此外,如果登錄失敗,你應該看到,如果會話屬性已經設置並查看任何其他特殊情況!

Btw我的過濾器曾用於utf-8格式化所有輸入/輸出。

希望它會幫助任何。

+1

你不應該使用靜態資源的過濾器,這將大大降低性能。 – weekens 2013-01-20 14:51:20

+0

你能更精確嗎? – rweiller 2013-02-15 14:23:13

+0

一般而言,您可以將靜態文件放在具有匿名訪問權限的目錄中,也可以放在完全不同的服務器上,該服務器上沒有任何安全性。只有真正的安全問題(即不是css或js)的靜態資源應該受到安全保護。 否則當你不需要每一個靜態資源請求時,你正在做所有這些處理(以及你看不到)。 – user2932397 2014-01-16 18:05:58

5
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

對我來說,我使用Spring Security的3.0.0和以下工作:

DefaultSavedRequest savedRequest =(DefaultSavedRequest)request.getSession()的getAttribute( 「SPRING_SECURITY_SAVED_REQUEST_KEY」); targetUrl = savedRequest.getRedirectUrl();