49 votes

Trouver l'URL de votre application avec seulement un ServletContext

J'écris une application web Java en utilisant Spring MVC. J'ai un processus d'arrière-plan qui parcourt la base de données et trouve les notifications qui doivent être envoyées par e-mail à mes utilisateurs. Ces messages électroniques doivent contenir des hyperliens vers l'application. Cela semble être un modèle assez commun pour une application Web, mais j'ai des difficultés.

Comment puis-je dériver l'URL pleinement qualifiée de mon application, avec le nom du serveur et le chemin du contexte ? Je n'ai accès à aucune des méthodes de HttpServletRequest car je l'exécute en tant que processus d'arrière-plan, et non en réponse à une requête Web. Le mieux que je puisse faire est d'avoir accès à ServletContext.

Actuellement, je place l'URL de base dans un fichier de configuration et je la lis au démarrage, mais cette application va être licenciée et déployée sur les serveurs d'application des clients, et si possible, j'aimerais qu'ils n'aient pas à configurer cela manuellement.

32voto

Vineet Reynolds Points 40529

Il n'est pas recommandé de préparer dynamiquement l'URL au moment de l'exécution, notamment en fonction de ServletRequest. La raison principale est que vous n'avez aucune idée de l'URL que les utilisateurs utiliseront pour accéder à l'application - le serveur d'application peut se trouver derrière un serveur Web, un pare-feu ou un équilibreur de charge. Pour faire court, il est impossible de prévoir les topologies de réseau.

Votre technique actuelle, qui consiste à extraire l'URL du fichier de propriétés, est suffisante pour résoudre le problème. Peut-être devriez-vous envisager de fournir une console d'administration pour gérer l'URL apparaissant dans les courriers électroniques, en particulier s'il existe une console d'administration en place, ou s'il existe des options connexes qui devraient y être intégrées.

Edit : Mon dernier point fait écho à ce dont Tony a parlé.

9voto

Tony BenBrahim Points 3827

Pourquoi ne pas simplement avoir une page web de configuration qui s'affiche lors de la première exécution de l'application si le fichier de configuration n'existe pas (dans le dossier WEB-INF par exemple). En utilisant ServletContext, vous pouvez appeler getRealPath et obtenir le chemin réel d'un fichier et voir s'il existe(). Si c'est le cas, rediriger vers la page de démarrage de l'application, sinon, ouvrir la page d'administration).

Le mieux que vous puissiez faire avec ServletContext est de lire certains paramètres de web.xml, et d'obtenir le chemin du contexte, seul le HttpRequest peut vous donner l'URL du FQ.

2voto

O.Wozniak Points 21

Je pense que vous pouvez utiliser quelque chose comme :

String host = InetAddress.getLocalHost().getCanonicalHostName();
String appUrl = String.format("http://%s:%s%s", host, port, contextPath);

avec le port et le contextPath de ServletContext.

1voto

gavenkoa Points 6974

0voto

Avez-vous vérifié avec un débogueur si votre ServletContext n'est pas une instance de HttpServletContext ? Si c'est le cas, castez-le et obtenez les informations à partir de là.

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