6 votes

Obtenir l'URL de base de l'application Spring Boot en dehors du contexte du servlet

La configuration est la suivante - j'ai une tâche planifiée qui enverrait des e-mails de vérification aux utilisateurs :

@Scheduled(cron = " 0 0-59/1 * * * * ")
public void sendVerificationEmails() {
    //...
}

Et dans ces e-mails, je dois inclure un lien renvoyant vers la même application web. Cependant, je ne trouve aucune référence sur la manière d'obtenir l'URL de base de l'application sans le contexte du servlet.

BONUS

Il serait également utile si je pouvais configurer ici le résolveur de modèles Thymeleaf pour fonctionner avec ces liens, mais pour cela j'ai besoin d'un WebContext qui nécessite une instance de HttpServletRequest.

6voto

eparvan Points 638

Suppose your app is using embedded tomcat server, then url to your app may be found as follows:

@Inject
private EmbeddedWebApplicationContext appContext;

public String getBaseUrl() throws UnknownHostException {
    Connector connector = ((TomcatEmbeddedServletContainer) appContext.getEmbeddedServletContainer()).getTomcat().getConnector();
    String scheme = connector.getScheme();
    String ip = InetAddress.getLocalHost().getHostAddress();
    int port = connector.getPort();
    String contextPath = appContext.getServletContext().getContextPath();
    return scheme + "://" + ip + ":" + port + contextPath;
}

Voici un exemple pour un serveur jetty intégré :

public String getBaseUrl() throws UnknownHostException {
    ServerConnector connector = (ServerConnector) ((JettyEmbeddedServletContainer) appContext.getEmbeddedServletContainer()).getServer().getConnectors()[0];
    String scheme = connector.getDefaultProtocol().toLowerCase().contains("ssl") ? "https" : "http";
    String ip = InetAddress.getLocalHost().getHostAddress();
    int port = connector.getLocalPort();

    String contextPath = appContext.getServletContext().getContextPath();
    return scheme + "://" + ip + ":" + port + contextPath;
}

3voto

Kristoffer Points 136

Dans ma configuration, j'ai une classe @Configuration configurant le chemin du contexte (codé en dur) et @Value injectant le numéro de port à partir de application.properties. Le chemin du contexte pourrait également être extrait dans un fichier de propriétés et injecté de la même manière, vous utiliseriez:

@Value("${server.port}")
private String serverPort;
@Value("${server.contextPath}")
private String contextPath;

Vous pouvez également implémenter ServletContextAware dans votre composant afin d'obtenir un hook vers le ServletContext qui vous donnerait également le chemin du contexte.

Je suppose que vous aimeriez envoyer une URL complète (incluant le nom complet du serveur) dans vos e-mails, mais vous ne pouvez pas vraiment être sûr que les destinataires d'e-mails accèdent directement à votre serveur d'application par le nom d'hôte, c'est-à-dire qu'il pourrait être derrière un serveur web, un proxy, etc. Vous pourriez bien sûr ajouter un nom de serveur que vous savez accessible depuis l'extérieur en tant que propriété également.

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