14 votes

RequestDispatcher pour serveur distant?

Je cherche à créer un HttpServlet qui redirige toutes les requêtes entrantes telles quelles vers un autre serlvet fonctionnant sur un domaine différent.

Comment cela peut-il être réalisé ? La méthode forward() de RequestDispatcher ne fonctionne que sur le même serveur.

Édition : Je ne peux pas introduire de dépendances.

22voto

BalusC Points 498232

Vous ne pouvez pas le faire quand cela ne s'exécute pas dans le même ServletContext ou le même/clustered serveur web où les webapps sont configurées pour partager le ServletContext (dans le cas de Tomcat, vérifiez l'option crossContext).

Vous devez envoyer une redirection en utilisant HttpServletResponse.sendRedirect(). Si votre préoccupation actuelle est de réutiliser les paramètres de la requête sur la nouvelle URL, il suffit de les renvoyer.

response.sendRedirect(newURL + "?" + request.getQueryString());

Ou s'il s'agit d'une requête POST, envoyez une redirection HTTP 307, le client réappliquera les mêmes paramètres de requête POST sur la nouvelle URL.

response.setStatus(HttpServletResponse.SC_TEMPORARY_REDIRECT);
response.setHeader("Location", newURL);

Mise à jour selon les commentaires, cela ne semble pas être une option non plus puisque vous souhaitez masquer l'URL. Dans ce cas, vous devez laisser le servlet jouer en tant que proxy. Vous pouvez le faire avec un client HTTP, par exemple le java.net.URLConnection fourni par Java SE (mini tutoriel ici) ou le plus pratique Apache Commons HttpClient.

S'il s'agit d'une requête GET, faites simplement :

InputStream input = new URL(newURL + "?" + request.getQueryString()).openStream();
OutputStream output = response.getOutputStream();
// Copie.

Ou s'il s'agit d'une requête POST :

URLConnection connection = new URL(newURL).openConnection();
connection.setDoOutput(true);
// Définir et/ou copier les en-têtes de requête ici en fonction de la requête actuelle ?

InputStream input1 = request.getInputStream();
OutputStream output1 = connection.getOutputStream();
// Copie.

InputStream input2 = connection.getInputStream();
OutputStream output2 = response.getOutputStream();
// Copie.

Remarquez que vous devrez éventuellement capturer/remplacer/mettre à jour les liens relatifs dans la réponse HTML, le cas échéant. Jsoup peut être extrêmement utile pour cela.

3voto

Mike Baranczak Points 4425

Comme d'autres l'ont souligné, ce que vous voulez est un proxy. Vos options:

  1. Trouver une bibliothèque Java open source qui fait cela. Il y en a quelques-unes, mais je n'en ai pas utilisé, donc je ne peux en recommander aucune.

  2. Écrivez-le vous-même. Ce ne devrait pas être trop difficile, il suffit de penser à traiter des choses comme transmettre tous les en-têtes et codes de réponse.

  3. Utilisez le module proxy dans Apache 2.2. C'est celui que je choisirais, car je sais déjà qu'il fonctionne de manière fiable.

2voto

Neeme Praks Points 4150

Jetty a un exemple d'implémentation de ProxyServlet qui utilise URL.openConnection() sous le capot. N'hésitez pas à l'utiliser tel quel ou comme source d'inspiration pour votre propre implémentation. ;-)

Ou vous pouvez utiliser Apache HttpClient, voir le tutorial.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X