如何在Java中重定向请求时在HTTP标头中传递数据

是否可以在HTTP Header中传递一些数据,同时将请求从一个服务器重定向到另一个服务器。

这是我的场景 ,我有一个通用filter,每个请求都通过它。 现在,基于某些条件,我使用API objHttpServletResponse.sendRedirect(strURL)将请求重定向到某个不同的服务器。

但是,问题是,当我在响应头中设置一些数据时,如objHttpServletResponse.setHeader("Key", "Value"); 这在重定向的服务器中不可用。

所以,我的问题是,

1.重定向请求时,有没有办法在标头中传递一些数据?

2.如果没有,在重定向请求时发送一​​些数据的其他可能方法是什么?

请注意:其他几种方式,比如

使用URL参数: objHttpServletResponse.sendRedirect(strURL+"?param="+ strParamValue);

要么

使用session: HttpSession session = httpRequest.getSession(); session.setAttribute("Key", "Value"); HttpSession session = httpRequest.getSession(); session.setAttribute("Key", "Value");

不是我所期待的。

您设置的标头将写入发送到客户端的响应,以及Location标头和状态代码。 请参阅使用servlet重定向请求,并且“setHeader”方法不起作用

然后,客户端应该向您在Location标头中指定的URL发送相同的请求。 与发送给您的请求相同。

您希望浏览器发送您指定的标头以及重定向的请求。 您是否考虑过添加(域)Cookie标头? 一些谷歌搜索让我相信,重定向响应中设置的cookie将被大多数浏览器选中。 请参见http://blog.dubbelboer.com/2012/11/25/302-cookie.html

请看一下Apache HttpClient 。

此示例向post请求添加了几个参数:

  String url = "https://selfsolve.apple.com/wcResults.do"; HttpClient client = HttpClientBuilder.create().build(); HttpPost post = new HttpPost(url); // add header post.setHeader("User-Agent", USER_AGENT); List urlParameters = new ArrayList(); urlParameters.add(new BasicNameValuePair("sn", "C02G8416DRJM")); urlParameters.add(new BasicNameValuePair("cn", "")); urlParameters.add(new BasicNameValuePair("locale", "")); urlParameters.add(new BasicNameValuePair("caller", "")); urlParameters.add(new BasicNameValuePair("num", "12345")); post.setEntity(new UrlEncodedFormEntity(urlParameters)); HttpResponse response = client.execute(post); System.out.println("Response Code : " + response.getStatusLine().getStatusCode()); 

您可以使用JS重定向,即不使用嵌入式javascript调用sendRedirect返回HTML页面,该页面将执行您需要的重定向设置标头。

但是,使用GET参数确实是最佳解决方案。 如果您担心用户手动更改参数 – 请使用MAC代码保护参数。请参阅消息validation代码

在最简单的forms中, ?p1=1&p2=2&mac={mac value}, where {mac value} = md5('MY_SECRET_KEY' + 'p1=1&p2=2'). 接收方可以重新计算MAC并将其与提供的MAC进行比较。 由于外部用户无法识别“MY_SECRET_KEY”,因此他们将无法生成有效的MAC。

您是否检查过/来自服务器的HTTP请求/响应? 您可以在chrome或firefox上使用多个插件来检查。 您将能够看到是否正在将值从服务器传递到另一台服务器
还使用httpResponse.getHeader(“Key”)检索标头; 不使用request.getHeader(“key”)。 几天前,我的一位同事面临同样的问题,他正在使用请求来获取标头值

问题是responseredirect()方法完全启动了一个新请求,从而丢失了重定向之前设置的属性。 幸运的是,还有一种流畅的解决问题的方法。

 response.setHeader("Key", "Value"); request.getRequestDispatcher("redirecturl").forward(request, response); 

然后在你的目的地,你可以做到

 response.getHeaders("key")