2014-01-09 55 views
1

我知道這可能不是針對此類問題的最佳設計,但僅針對特定要求。將HttpServletResponse注入到服務層的最佳方法

當前應用程序需要ServletContext,HttpServletRequest,HttpServletResponse進入服務層爲customized authentication provider

顯然沒有任何具體的配置或繼承下面的代碼:

@Component("myAuthenticaionProvider") 
public class MyAuthenticaionProvider implements AuthenticationUserDetailsService { 
    @Autowired private ServletContext context; 
    @Autowired private HttpServletRequest request; 
    @Autowired private HttpServletResponse response; 
     ....... 
} 

必須拋出異常:有

  1. 攔截HttpServletRequest

    nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: 
    No matching bean of type [javax.servlet.http.HttpServletResponse] found for dependency: 
    

    可能的解決方案,我能想到的過濾器,但這需要一個URL模式,否則會攔截所有我認爲可能是性能問題的網址?

  2. 在spring-security.xml或application-context.xml中創建一個request scope bean,然後注入當前身份驗證提供程序類,以使其能夠獲取HttpServletRequest。但我認爲這裏有什麼問題,因爲如何啓動請求範圍bean?

那麼最佳做法是什麼?

+1

你究竟想要達到什麼目的? – dhamibirendra

+2

這是個壞主意,但在適當的環境中它會起作用。 ((ServletWebRequest)RequestContextHolder.getRequestAttributes())。getResponse();'。通過_適當的environment_,我的意思是'getRequestAttributes()'返回的'RequestAttributes'是類型'ServletWebRequest'。 –

+0

如果你描述了你想要達到的目標,獲得一個好的解決方案的機會會更高。對我來說,它看起來像你需要一個過濾器(特別是因爲響應對象),但你不希望這樣。所以我真的很想知道誰在調用這個服務,何時(以及爲什麼)。 – zeroflagL

回答

2

除了作爲一個「壞主意」之外,請求對象只能在請求期間生存。由於生命週期的差異,你不能將它注入單例。你可以通過方法參數傳遞它。

與您的請求匹配的最接近的解決方案是在捕獲所有過濾器內部創​​建一個ThreadLocal變量,並將其設置在那裏並將該過濾器或委託注入到本地線程中的線程中。我強烈建議你避免這種情況。

+0

有趣的是,我發現'HttpServletRequest'能夠自動裝配到服務層。但不知道它是如何啓動的。感謝您的建議。 – Dreamer

0

您是否嘗試過在AuthenticationUserDetailsS​​ervice中實現HttpRequestHandler接口?

+0

感謝所以使用攔截器是迄今爲止最好的選擇? – Dreamer

+0

我不知道,但是您需要在需要http servlet的自定義authprovider中實現的是什麼? – Vaelyr

相關問題