2009-08-07 94 views
5

我正在使用澤西島的網絡應用程序。我正在嘗試使用URIBuilder和seeOther響應來實現事後處理。目標是重定向到瀏覽器已經在的相同URI,但強制GET。它的工作原理有點像這樣:澤西島 - 重定向使用得不到,導致重定向循環

  1. 請求通過PUT
  2. PUT請求處理
  3. SeeOther響應返回

什麼應該發生的是,瀏覽器拿起303查看其它的當選,在它接收的URI上執行GET。不幸的是,發生的事情是它在URI上執行PUT(據我所知),並且PUT將它發送回上面的步驟1,導致重定向循環。

任何想法這裏有什麼問題嗎?

private Response giveSeeOther(){ 
    /*Get the base URI builder*/ 
    final UriBuilder uriBuilder = m_uriInfo.getBaseUriBuilder(); 

    /* Some stuff to create the URI */ 
    final Map<String, Object> parameterMap = new HashMap<String, Object>(); 
    parameterMap.put("uid", getUid()); 

    final URI redirectUri = uriBuilder.path(SomeObject.class). 
            path(SomeObject.class, "get"). 
            buildFromMap(parameterMap); 

    /* See Other (303) */ 
    return Response.seeOther(redirectUri).build();} 

這就是查看其他方法的代碼。我不確定你想看哪些其他代碼,但請告訴我。

+0

你的'seeOther'的代碼看起來很好(不是我理解uriBuilder用類做什麼)。要檢查的一件事是,只能從PUT處理程序調用'giveSeeOther()',而不是從通用處理程序調用'giveSeeOther()'。我也很想知道哪些用戶代理可以看到這種行爲。 – Guss 2009-09-09 10:58:25

回答

8

您需要使用301 HTTP響應代碼。

通過使用303,您的POST請求被維護並相應地重定向。通過使用301,您的請求通過GET「永久移動」。

對於其他讀者可能想知道爲什麼有人想要這樣做,這是爲了防止用戶使用其Web瀏覽器的「重新加載」功能多次提交他們的POST數據(具有「爛通信」問題的用戶通常會這樣做)重新加載可能尚未完全加載的「謝謝」頁面。

提示:當您以這種方式重定向時,如果您不使用cookie來確保信息到達「謝謝」頁面,那麼您需要以相同的方式向請求添加一個或多個參數一個常規的GET表單將會。例如,如果訂單的ID號是82838,你可以把它傳遞給你的「感謝您」頁面是這樣的:

http://www.example.com/order/thank-you.pl?orderid=82838

有這種明顯的潛在的安全問題,他們很容易被具有解決您的「謝謝」頁面代碼檢查訂單ID是否實際屬於當前登錄的用戶,然後顯示訂單狀態(我假設您希望在該「謝謝」頁面上包含訂單狀態信息 - 在這種情況下,它也是如果用戶在短時間內通過多個步驟進行操作,則可以包含「刷新」按鈕{或鏈接},以便查看訂單狀態。

我希望這對你有幫助。