1

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

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为空。重定向后如何保留请求正文(或至少是其中的这一部分)?

谢谢。

4

3 回答 3

6

我发现另一种可行的方法是 307(临时重定向)。这保留了原始请求的主体,因此在这种情况下有效。307 重定向有一些安全隐患,详见此处,但是没有让原始主机充当阻塞 HTTP 请求的代理的好处。

public void doFilter(...)
{
    ...
    httpResponse.setStatus(TEMPORARY_REDIRECT);
    httpResponse.setHeader("Location", redirectLocation);
    return;
}
于 2013-02-19T06:39:29.673 回答
2

sendRedirect()重新访问用户的浏览器并从浏览器访问重定向的 url。

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

你可以做什么 :

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

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

阅读有关URL 重定向的更多信息

于 2013-02-18T11:28:23.130 回答
2

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

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

于 2013-02-18T11:28:27.110 回答