Как передать данные в HTTP-заголовке при перенаправлении запроса на Java

можно ли передать некоторые данные в HTTP-заголовке, перенаправляя запрос с одного сервера на другой.

вот мой сценарий, У меня есть один общий фильтр, через который проходит каждый запрос. Теперь, исходя из некоторых условий, я перенаправляю запрос на другой сервер, используя API objHttpServletResponse.sendRedirect(strURL).

но проблема в том, когда я устанавливаю некоторые данные в заголовке ответа, например objHttpServletResponse.setHeader("Key", "Value"); это недоступно в перенаправленном сервер.

Итак, мои вопросы,

1. Есть ли способ передать некоторые данные в заголовок при перенаправлении запроса?

2. Если нет, то каковы другие возможные способы передачи данных при перенаправлении запроса?

Обратите Внимание: несколько других способов, как

использование параметров URL: objHttpServletResponse.sendRedirect(strURL+"?param="+ strParamValue);

или

используя сессии: HttpSession session = httpRequest.getSession(); session.setAttribute("Key", "Value");

- это не то, что я ожидал.

5 ответов


заданные заголовки записываются в ответ, который отправляется клиенту, вместе с заголовком местоположения и кодом состояния. См.перенаправление запроса с помощью сервлетов и метода "setHeader" не работает

затем клиент должен отправить идентичный запрос на URL-адрес, указанный в заголовке местоположения. идентичный запрос отправлен к вам.

вы хотите, чтобы браузер отправил заголовок, который вы укажете вместе с перенаправленный запрос. Вы рассматривали возможность добавления заголовка Cookie (домена)? Некоторые googling заставляет меня поверить, что cookies, установленные в ответе перенаправления, будут подобраны большинством браузеров. См.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<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());

вы можете использовать перенаправление JS, т. е. вместо вызова sendRedirect возврат HTML-страницы со встроенным javascript, который будет делать перенаправление заголовков настроек вам нужно.

однако использование параметров GET-действительно лучшее решение. Если у вас есть опасения по поводу пользователей, изменяющих параметры вручную-используйте MAC-код для защиты параметров.Видеть код аутентификации сообщения

в простейшей форме, ?p1=1&p2=2&mac={mac value}, where {mac value} = md5('MY_SECRET_KEY' + 'p1=1&p2=2'). Принимающая сторона может пересчитать MAC и сравнить его с предоставленным. Поскольку внешние пользователи не могут знать "MY_SECRET_KEY", они не смогут сделать допустимый MAC.


вы проверили HTTP запрос/ответ от/к серверу? Вы можете использовать несколько плагинов в chrome или firefox, чтобы проверить это. Вы сможете увидеть, передается ли значение с вашего сервера на другой сервер или нет
также извлеките заголовок с помощью httpResponse.getHeader("ключ"); не используя запрос.getHeader("ключ"). Один из моих коллег столкнулся с той же проблемой несколько дней назад, он использовал запрос для извлечения значений заголовка


проблема в том, что redirect() метод response инициирует новый запрос полностью, тем самым теряя атрибуты, которые были установлены перед перенаправлением. К счастью, есть свободный способ решения проблемы до сих пор.

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

тогда в пункте назначения вы можете сделать

response.getHeaders("key")