2013-02-18 30 views
0

我有一個Java Web應用程序部署在2臺主機上,前端是一個servlet過濾器。我發送POST請求到應用一臺主機,其通過所述過濾器攔截並重定向到另一臺主機上:如何保留從servlet過濾器執行HTTP重定向的請求正文

public void doFilter (ServletRequest request, ServletResponse response, 
     FilterChain filterChain) 
{ 
    ... 
    if(shouldRedirect) { 
     httpResponse.sendRedirect(redirectLocation); 
    } 
} 

在第二機器,該請求通過過濾器,並通過一個REST API中處理一個資源類。

@POST 
public Response handleRequest(InputStream stream) 
{ 
    ... 
} 

stream對象作爲POST請求主體的一部分發送。重定向後,請求主體不會被髮送,並且stream爲空。如何在重定向之後保留請求主體(或至少這部分)?

謝謝。

回答

2

我執行後的redirectLocation代替。 sendRedirect告訴客戶端改變它的位置,這樣你就開始了一個新的HTTP請求。

當您執行重定向時,您可以讓客戶端發起對新URL的原始POST請求。

2

sendRedirect()重新訪問用戶的瀏覽器並從瀏覽器訪問重定向的URL。

話雖如此,POST數據僅在初始主機處可用,其中first request已被記錄。即在這種情況下是過濾器。

你可以做什麼:

修改重定向URL包括POST數據Request Parameters in GET url

例如host2\servlet?param=one&param2=two

瞭解更多關於URL Redirection

5

我發現的另一種方法可能是307(臨時重定向)。這保留了原始請求的主體,所以它在這種情況下起作用。 307重定向具有一些安全性影響,詳情如下:here,但有一個好處,即不需要原始主機充當阻塞HTTP請求的代理。

public void doFilter(...) 
{ 
    ... 
    httpResponse.setStatus(TEMPORARY_REDIRECT); 
    httpResponse.setHeader("Location", redirectLocation); 
    return; 
} 
+0

謝謝,這真的解決了我的問題,就像一個魅力。 – Madwyn 2014-07-01 17:46:48

+0

thx,這是一個很好的答案,爲我的請求工作,也有一些數據的身體 – osmingo 2017-09-12 13:27:06