如何在从servlet过滤器执行HTTP重定向时保留请求主体

时间:2013-02-18 11:21:25

标签: java http-post servlet-filters

我有一个部署在2台主机上的Java Web应用程序,前面是servlet过滤器。我在一台主机上向应用程序发送了一个POST请求,该请求被过滤器拦截并重定向到另一台主机:

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

在第二台机器上,请求传递过滤器,并由Resource类中的REST API处理。

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

stream对象作为POST请求正文的一部分发送。重定向后,请求正文不会被发送,stream为空。如何在重定向后保留请求正文(或至少这部分)?

感谢。

3 个答案:

答案 0 :(得分:6)

我发现的另一种方法是307(临时重定向)。这保留了原始请求的正文,因此在这种情况下可以正常工作。 307重定向具有一些安全隐患,如详细here,但有一个好处是没有原始主机充当阻塞HTTP请求的代理。

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

答案 1 :(得分:2)

sendRedirect()重新访问用户的浏览器,然后从浏览器访问重新定向的网址。

话虽如此,POST数据仅在已收回first request的初始主机上可用。即在这种情况下过滤。

你能做什么:

修改您的重定向网址,将POST数据包含为Request Parameters in GET url

e.g。 host2\servlet?param=one&param2=two

详细了解URL Redirection

答案 2 :(得分:2)

我会改为向redirectLocation发帖子。 sendRedirect告诉客户端更改其位置,以便您在此时开始新的HTTP请求。

执行重定向时,您可以让客户端向新URL发起原始POST请求。