設定は次のとおりです。ユーザーに確認メールを送信する時間指定のタスクがあります。
@Scheduled(cron = " 0 0-59/1 * * * * ")
public void sendVerificationEmails() {
//...
}
これらのメールには、同じウェブアプリに戻るリンクを含める必要があります。ただし、サーブレットコンテキストなしでアプリのベースURLを取得する方法の参照は見つかりません。
[〜#〜]ボーナス[〜#〜]
ここでthymeleafテンプレートリゾルバを設定してそれらのリンクを処理できるようにすると、さらに役立ちますが、そのためにはWebContext
が必要で、これにはHttpServletRequest
のインスタンスが必要です。
アプリが組み込みの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;
}
私のセットアップでは、コンテキストパス(ハードコード化)をセットアップする@Configurationクラスと、application.propertiesからポート番号を挿入する@Valueを持っています。コンテキストパスをプロパティファイルに抽出し、同じ方法で挿入することもできます。
@Value("${server.port}")
private String serverPort;
@Value("${server.contextPath}")
private String contextPath;
コンポーネントにServletContextAwareを実装して、コンテキストパスを提供するServletContextへのフックを取得することもできます。
電子メールで完全なURL(完全なサーバー名を含む)を発送したいと思いますが、電子メールの受信者がホスト名で直接アプリケーションサーバーにアクセスしていることを確認することはできません。 Webサーバー、プロキシなど。もちろん、外部からアクセスできるサーバー名をプロパティとして追加することもできます。