如何在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”)。 几天前,我的一位同事面临同样的问题,他正在使用请求来获取标头值
问题是response
的redirect()
方法完全启动了一个新请求,从而丢失了重定向之前设置的属性。 幸运的是,还有一种流畅的解决问题的方法。
response.setHeader("Key", "Value"); request.getRequestDispatcher("redirecturl").forward(request, response);
然后在你的目的地,你可以做到
response.getHeaders("key")