2013-07-16 82 views
1

我在一個項目中使用Spring的Android,我需要管理cookie存儲/管理器。我可以通過使用ClientHttpRequestInterceptor的實現向任何請求添加cookie,但是我想在發送請求時刪除其中的一部分。android-spring resttemplate管理cookie

更具體地講,我面臨的問題是,對於升級Froyo,在Spring實施特定的(與DefaultHttpClient),以頭從CookieStore餅乾自動添加 - 即使我設置明確的標頭。但我想自己管理這些cookie(刪除其中的一些,或更新它們的值)。雖然上面的薑餅(Spring執行與HttpURLConnection完成)只有當我自己做的時候纔會添加餅乾 - 但是我不確定,因爲我沒有看到春天設置任何CookieHandler,但底線是我不'在執行請求時看不到他們,或者我可以看到他們更新。所以這個問題對於Froyo更具體。

解決方法是重置連接工廠;是這樣的:

protected void resetCookieStoreForTemplate(RestTemplate template) { 
    if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.FROYO) { 
     template.setRequestFactory(new HttpComponentsClientHttpRequestFactory()); 
    } 
} 

在下面,這似乎重現DefaultHttpClient,並將使用新的CookieStore。但是這在我看來有點難看。

總結起來,我的問題是:Spring for Android是否提供了一些方法來公開一些用於Cookie管理的API?只要RestTemplate公開了一些關於連接,連接工廠,消息轉換器等的抽象概念,我將非常高興有一些抽象的cookie管理。

+0

賞金逝去:(......將在'Spring'社區發佈這個問題,並將這個問題鏈接到這個問題。無論如何感謝 – gunar

回答

2

我自己並沒有使用過Spring,但是從我讀過的東西中,它遵循官方建議,並基於API版本切換HTTP客戶端(如果認真過度設計,我相當聰明)。如上所述,使用HTTPUrlConnection時,Spring可能不會更改CookieHandler。你應該看到內存中的cookie處理,所以一切都應該適用於同一應用程序運行的請求,但是當你關閉應用程序時cookie會被擦除。你能證實這是你看到的嗎?

如果是這樣,你所要做的就是創建一個新的CookieManager實例,它傳遞一個自定義CookieStorenullCookiePolicy使用默認。

不幸的是,一個持久存儲不是內置的,但寫入一個也不是特別困難。

編輯:請參閱here瞭解使用SharedPreferences(尚未自行測試)的CookieStore。

+0

如前所述,我面臨的問題是Froyo(http引擎使用Apache'DefaultHttpClient'實現)特有的問題,因爲我沒有看到任何對'CookieStore'的訪問。上面的Gingerbread中的優雅解決方案(通過CookieHandler設置一個持久的'CookieStore')工作得很好,但我沒有這樣的訪問Apache'CookieStore'的實現。我希望有一些API來抽象訪問'CookieStore' ......老實說,我認爲這個問題應該發佈在Spring社區上,因爲在我看來這是一個功能請求。 – gunar

+0

糟糕,從您的描述中,聽起來像薑餅和以上是問題。在那種情況下,是的,它的確聽起來像一個功能請求,春天社區是您最好的地方。 – Delyan

+0

'從你的描述中,聽起來像薑餅和以上是問題... ...嗯。我已經編輯了一下這個問題:「但我想自己管理這些cookie(刪除它們中的一些,或者更新它們的值)。」希望更清楚。感謝您舉報該觀察! – gunar

1

ClientHttpRequestInterceptor類是一個很好的方法,當你需要爲所有的請求傳遞共同的頭文件,例如設置內容類型,授權等。據我所知,你想傳遞一些cookie值爲特定的請求。 您也可以通過HttpEntityHttpHeaders類來實現。

HttpHeaders requestHeaders = new HttpHeaders(); 
    requestHeaders.add("Cookie", "name=" + value); 
    HttpEntity requestEntity = new HttpEntity(null, requestHeaders); 
    ResponseEntity response = restTemplate.exchange(
     "http://server/service?...", 
     HttpMethod.GET, 
     requestEntity, 
     Response.class); 

彈簧安置模板不提供任何關閉管理cookie自我解決方案。類別CookieHandler由Apache提供,不屬於spring。與Spring核心相比,Rest模板只是管理請求響應的基本解決方案。

+0

感謝您的回答,但是我恐怕這並不會幫助,因爲我的問題是:'Spring for Android是否提供了一些方法來公開一些用於Cookie管理的API?'我已經傳遞了一個自定義'Cookie' 2-phrase),但我需要管理整個cookie存儲。我可以在API級別9中通過在CookieHandler.setDefault(...)中設置一個持久的'CookieStore'來做到這一點,但對於Froyo我沒有看到這樣的中央cookie回購可以自動鏈接到'DefaultHttpClient'。 – gunar

+0

我已經更新了我的答案。 –

+0

'據我瞭解,您希望爲特定請求傳遞一些Cookie值。「我想刪除或編輯這些Cookie。這適用於上面的薑餅,但它不適用於Froyo,因爲在我看來,'DefaultHttpClient'使用'CookieStore'中的內容,忽略通過'ClientHttpRequestInterceptor'傳遞的匹配頭。題外話:'CookieHandler'似乎不是由Apache提供的,因爲它的包名是'java.net'。所以我的問題是,我沒有看到任何API來訪問cookie存儲。我希望在那裏看到一些抽象。 – gunar