web-dev-qa-db-fra.com

Trouver l'URL de votre application avec seulement un ServletContext

J'écris une application Web Java utilisant Spring MVC. J'ai un processus d'arrière-plan qui parcourt la base de données et trouve des notifications qui doivent être envoyées par courrier électronique à mes utilisateurs. Ces messages électroniques doivent pour inclure des hyperliens vers l'application. Cela semble être un modèle assez courant pour une application Web, mais j'ai des problèmes.

Comment puis-je obtenir l'URL complète de mon application, avec le nom du serveur et le chemin de 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, pas en réponse à une demande Web. Le mieux que je puisse faire est d'avoir accès à ServletContext.

Actuellement, je mets l'URL de base dans un fichier de configuration et je le lis au démarrage, mais cette application va être autorisée et déployée sur les serveurs d'applications des clients, et si possible, je voudrais qu'ils n'aient pas à le configurer manuellement.

49
Josh Hinman

Il n'est pas recommandé de préparer dynamiquement l'URL au moment de l'exécution, en particulier sur la base de ServletRequest. Cela est principalement dû au fait que vous n'avez aucune idée de l'URL que les utilisateurs utiliseraient pour accéder à l'application - le serveur d'applications peut être derrière un serveur Web, un pare-feu ou un équilibreur de charge. Pour faire court, on ne peut pas prévoir les topologies de réseau.

Votre technique actuelle de récupération de l'URL à partir du fichier de propriétés est suffisante pour résoudre ledit problème. Vous devriez peut-être envisager de fournir une console d'administration pour gérer l'URL apparaissant dans les e-mails, en particulier si une console d'administration est en place ou s'il existe des options connexes qui devraient y aller.

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

32
Vineet Reynolds

Pourquoi ne pas avoir une page Web d'installation qui apparaît la première fois que l'application est exécutée 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 si elle existe (). Si c'est le cas, redirigez vers la page de démarrage de l'application, si ce n'est pas le cas, ouvrez 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, seule la requête HttpRequest peut vous donner l'URL FQ.

9
Tony BenBrahim

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 port et contextPath de ServletContext.

2
O.Wozniak
2
gavenkoa

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