Как передавать данные в заголовке 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( "ключ" ). Один из моих коллег столкнулся с тем же вопросом несколько дней назад, он использовал запрос для получения значений заголовков