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