Как передавать данные в заголовке 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");

не то, что я ожидаю.

Ответы

Ответ 1

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

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

Вы хотите, чтобы браузер отправил указанный вами заголовок вместе с перенаправленным запросом. Рассматривали ли вы добавление заголовка Cookie (домена)? Некоторый googling заставляет меня думать, что файлы cookie, установленные в ответе на перенаправление, получат большинство браузеров. См. http://blog.dubbelboer.com/2012/11/25/302-cookie.html

Ответ 2

Пожалуйста, посмотрите Apache HttpClient.

В этом примере добавляется несколько параметров для почтового запроса:

    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());

Ответ 3

Вы можете использовать перенаправление 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.

Ответ 4

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