2013-02-23 65 views
0

我正在使用Jersey來構建一個RESTful服務來替換現有的傳統服務。在移交給澤西島之前檢查請求實體

傳統請求格式要求身份驗證憑證在POST請求中傳遞。這使得在將請求傳遞給Jersey之前驗證請求(使用Spring安全性)很尷尬,因爲必須讀取POST正文以提取身份驗證憑證,然後在切換到Jersey之前重新打包。

這意味着,對於每個POST請求,請求流必須被讀取,重新序列化,然後由Jersey MessageBodyReader再次讀取。我不喜歡這個,因爲它效率低下。理想情況下,我想要做的是將傳入消息轉換爲規範消息格式,對其進行身份驗證,然後將該規範格式傳遞給Jersey。看起來JAX-RS似乎不支持這種事情。

有沒有人有避免這種雙重請求正文的方法的建議?任何RESTful框架允許我使用自定義的規範消息格式,而不是在InputStream

謝謝!

回答

0

這裏有幾個選項。

最簡單的方法是閱讀郵件正文並使用它來檢查過濾器中的憑據。但是,如果您這樣做,則需要設置數據的一個InputStream,以便您可以將它傳遞給可能存在的任何下游過濾器(最終將消息正文讀取器)。聽起來像這樣,你一直在走,我建議你堅持下去。您不需要重新進行串行化,因爲您有原始輸入字符串,並且可以沿着InputStream傳遞它,而無需對其進行轉換,並且如果輸入格式良好,您可能也可以避免完整的序列化。

或者,您可以在檢查憑據的同時將所有內容都轉換爲某種描述的規範對象,並將其存儲爲可由您的資源訪問的請求變量。麻煩的是,你正在與澤西的做法相抗衡,所以我不會推薦它。你的資源方法對於局外人來說看起來有點奇怪,你的過濾器需要知道你的模型的所有信息,所以設計有點亂七八糟。

+0

感謝您的回答。我同意第二個選擇是尷尬的,我會避免它。第一種選擇,即我一直這樣做的方式,要求我反序列化消息體兩次:一次在身份驗證期間,一次在Jersey傳遞給MessageBodyReader時。 – maxenglander 2013-02-24 19:36:49

+0

嗯...你是否在認證片段之外使用通用對象作爲消息體,或者消息體是否總是包含相同的對象?如果後者那麼也許第二種選擇不會太糟糕。 – jgm 2013-02-24 19:40:01

+0

不幸的是,郵件正文的格式可能會有所不同。我想要做的一件事就是實現一個實現'InputStream'的規範對象,並實現一個自定義的'MessageBodyReader',它簡單地將'InputStream'轉換爲適當的規範對象。不過,我不喜歡「打擊」澤西島的想法。我想我會選擇1,或者尋找另一個更適合我的需求的框架。理想情況下,我希望通過RESTful路由支持一些企業模式。 – maxenglander 2013-02-24 20:16:17