web-dev-qa-db-ja.com

Spring Bootがサーブレットコンテキスト外のアプリケーションベースURLを取得する

設定は次のとおりです。ユーザーに確認メールを送信する時間指定のタスクがあります。

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

これらのメールには、同じウェブアプリに戻るリンクを含める必要があります。ただし、サーブレットコンテキストなしでアプリのベースURLを取得する方法の参照は見つかりません。

[〜#〜]ボーナス[〜#〜]

ここでthymeleafテンプレートリゾルバを設定してそれらのリンクを処理できるようにすると、さらに役立ちますが、そのためにはWebContextが必要で、これにはHttpServletRequestのインスタンスが必要です。

8
Ben

アプリが組み込みのTomcatサーバーを使用しているとすると、アプリのURLは次のようになります。

@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;
}

次に、組み込みの突堤サーバーの例を示します。

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;
}
7
eparvan

私のセットアップでは、コンテキストパス(ハードコード化)をセットアップする@Configurationクラスと、application.propertiesからポート番号を挿入する@Valueを持っています。コンテキストパスをプロパティファイルに抽出し、同じ方法で挿入することもできます。

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

コンポーネントにServletContextAwareを実装して、コンテキストパスを提供するServletContextへのフックを取得することもできます。

電子メールで完全なURL(完全なサーバー名を含む)を発送したいと思いますが、電子メールの受信者がホスト名で直接アプリケーションサーバーにアクセスしていることを確認することはできません。 Webサーバー、プロキシなど。もちろん、外部からアクセスできるサーバー名をプロパティとして追加することもできます。

4
Kristoffer