2012-05-30 65 views
5

我有一個配置了Spring Security處理認證的澤西島應用程序。 jersey-spring包提供的SpringServlet類在我的web.xml中註冊爲servlet。澤西島和過濾器異常處理

身份驗證和所有預期的工作。我想知道的是如何讓Jersey servlet發送AuthenticationExceptions(和其他過濾器異常),所以我可以使用我們的ExceptionMapper來處理它們。

最初SpringServlet被配置爲一個過濾器,但是在做了一些閱讀之後,我明白了一個servlet應該能夠處理過濾器中拋出的異常(也許這是一種不正確的理解)。在將其更改爲servlet後,我沒有注意到行爲有任何變化,並且如果通過Spring Security代碼追蹤,我可以看到HttpServletResponse正在寫入的位置。

我的問題:是否有可能讓Jersey Security過濾器拋出Jersey servlet進程異常?

+0

你好尼克,你有可能發佈一個SSCCE來演示你自己的設置嗎? –

+0

是的,只要我有機會,我會添加一個小樣本。 –

回答

0

你如何去做取決於你是從Spring Security調用Jersey還是從Jersey來的Spring Security。

如果您從Jersey容器內部調用Spring Security,則除了爲相應的異常定義異常映射器之外,您不必執行其他任何操作。

如果您只在客戶端通過Spring Security過濾器時調用Jersey,那麼在客戶端請求通過這些過濾器時拋出的任何異常都不會被Jersey捕獲(因爲請求尚未進入Jersey容器) 。 「得」異常到Jersey容器的一種方法是:

  1. 抓在定製認證過濾器AuthenticationException並調用AuthenticationFailureHandler.onAuthenticationFailure()方法(傳入除外),並確保通過打破過濾器鏈調用FilterChain.doFilter()
  2. 配置AuthenticationFailureHandler打電話給你設計的新澤西州的資源,將檢索(然後重新擲)由彈簧產生的任何異常與HttpServletRequest.getAttribute(WebAttributes.AUTHENTICATION_EXCEPTION)

可能還有其他方法可以將例外「獲得」到澤西島,但這是過去對我而言的一種方式。

+0

感謝您對這個非常古老的問題的迴應;問題依然存在,但我會盡快給你一個建議。儘管現在我已經在這個項目上工作了一段時間了! –

+0

糟糕,沒有意識到問題太舊了.. – maxenglander