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

问题描述 投票:16回答:5

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

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

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

所以,我的问题是,

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

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

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

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

要么

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

不是我所期待的。

java http-headers servlet-filters http-redirect
5个回答
8
投票

您设置的标头将写入发送到客户端的响应,以及Location标头和状态代码。见Redirecting a request using servlets and the "setHeader" method not working

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

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


2
投票

请看看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<NameValuePair> urlParameters = new ArrayList<NameValuePair>();
    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());

0
投票

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

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

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


0
投票

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


0
投票

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

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

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

response.getHeaders("key")
© www.soinside.com 2019 - 2024. All rights reserved.