est-il possible de transmettre des données dans l'en-tête HTTP, tout en redirigeant une requête d'un serveur à un autre?.
Voici mon scenario , J'ai un filtre générique, par lequel chaque requête passe . Maintenant, en fonction de certaines conditions, je redirige la demande vers un serveur différent à l'aide de l'API objHttpServletResponse.sendRedirect(strURL)
.
Mais le problème est que, lorsque je configure certaines données dans l'en-tête de réponse, telles que objHttpServletResponse.setHeader("Key", "Value");
, elles ne sont pas disponibles sur le serveur redirigé.
Donc, mes questions sont,
1. Est-il possible de transmettre des données dans l'en-tête lors de la redirection d'une demande?
2. Sinon, quels sont les autres moyens possibles d'envoyer des données tout en redirigeant une demande?
S'il vous plaît noter: quelques autres moyens, comme
en utilisant les paramètres d'URL: objHttpServletResponse.sendRedirect(strURL+"?param="+ strParamValue);
ou
en utilisant session: HttpSession session = httpRequest.getSession();
session.setAttribute("Key", "Value");
n'est pas ce que j'attends.
Les en-têtes que vous définissez sont écrits dans la réponse envoyée au client, avec un en-tête Location et un code d'état. See Redirection d'une requête à l'aide de servlets et de la méthode "setHeader" ne fonctionnant pas
Le client est alors censé envoyer une demande identique à l'URL que vous avez spécifiée dans l'en-tête Location. Identique à la demande qu'il vous a été envoyée.
Vous souhaitez que le navigateur envoie un en-tête que vous spécifiez avec la demande redirigée. Avez-vous envisagé d'ajouter un en-tête de cookie (domaine)? Certaines recherches sur Google m'amènent à penser que la plupart des navigateurs capturent les cookies installés dans une réponse de redirection. Voir http://blog.dubbelboer.com/2012/11/25/302-cookie.html
S'il vous plaît jeter un oeil à Apache HttpClient .
Cet exemple ajoute plusieurs paramètres à la demande de publication:
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());
Le problème est que la méthode redirect()
de response
initie une nouvelle demande, perdant ainsi les attributs définis avant la redirection. Heureusement, il existe toujours un moyen efficace de résoudre le problème.
response.setHeader("Key", "Value");
request.getRequestDispatcher("redirecturl").forward(request, response);
Ensuite, dans votre destination, vous pouvez faire
response.getHeaders("key")
Avez-vous vérifié la requête/réponse HTTP de/vers le serveur? Vous pouvez utiliser un certain nombre de plugins sur chrome ou firefox pour vérifier cela. Vous pourrez voir si une valeur est transmise de votre serveur à un autre serveur ou pas
Récupérez également l'en-tête à l'aide de httpResponse.getHeader ("Key"); ne pas utiliser request.getHeader ("clé"). Un de mes collègues faisait face au même problème il y a quelques jours, il utilisait request pour récupérer les valeurs d'en-tête.
Vous pouvez utiliser la redirection JS, c’est-à-dire au lieu d’appeler sendRedirect
, renvoyez une page HTML avec javascript intégré qui redirige les en-têtes de réglage dont vous avez besoin.
Cependant, utiliser les paramètres GET est vraiment la meilleure solution. Si vous craignez que les utilisateurs ne modifient les paramètres manuellement, utilisez le code MAC pour protéger les paramètres.Voir Code d'authentification du message
Dans sa forme la plus simple, ?p1=1&p2=2&mac={mac value}, where {mac value} = md5('MY_SECRET_KEY' + 'p1=1&p2=2').
Le côté destinataire peut recalculer le code MAC et le comparer à celui fourni. Étant donné que les utilisateurs externes ne peuvent pas connaître 'MY_SECRET_KEY', ils ne pourront pas créer de MAC valide.