51

Spring MVC を使用して Java Web アプリを作成しています。データベースを通過するバックグラウンド プロセスがあり、ユーザーに電子メールで送信する必要がある通知を見つけます。これらの電子メール メッセージには、アプリケーションへのハイパーリンクを含める必要があります。これは、Web アプリではかなり一般的なパターンのようですが、問題が発生しています。

サーバー名とコンテキスト パスを使用して、アプリケーションの完全修飾 URL を取得するにはどうすればよいですか? HttpServletRequest のどのメソッドにもアクセスできません。これは、Web 要求に応答するのではなく、バックグラウンド プロセスとして実行しているためです。私にできる最善のことは、ServletContext にアクセスすることです。

現在、ベース URL を構成ファイルに入れて起動時に読み取るようにしていますが、このアプリケーションはライセンスされて顧客のアプリケーション サーバーにデプロイされる予定であり、できれば手動で構成する必要がないようにしたいと考えています。

4

4 に答える 4

33

特に ServletRequest に基づいて、実行時に URL を動的に準備することはお勧めしません。これは主に、ユーザーがアプリケーションにアクセスするために使用する URL がわからないためです。アプリケーション サーバーは、Web サーバー、ファイアウォール、またはロード バランサーの背後にある可能性があります。簡単に言うと、ネットワーク トポロジを予測することはできません。

プロパティ ファイルから URL を取得する現在の手法は、上記の問題を解決するのに十分です。メールに表示される URL を管理するための管理コンソールを提供することを検討する必要があるかもしれません。特に、管理コンソールが配置されている場合、または管理コンソールに関連するオプションがある場合はそうです。

編集: 私の最後のポイントは、トニーが話した内容と同じです。

于 2009-03-24T01:51:26.790 に答える
8

構成ファイルが存在しない場合 (たとえば、WEB-INF フォルダーにある場合)、アプリケーションを初めて実行したときにセットアップ Web ページが表示されないのはなぜですか。ServletContext を使用すると、getRealPath を呼び出して、ファイルの実際のパスを取得し、存在するかどうかを確認します(存在する場合はアプリの開始ページにリダイレクトし、存在しない場合は管理ページを開きます)。

ServletContext で行う最善の方法は、web.xml からいくつかの設定を読み取り、コンテキスト パスを取得することです。HttpRequest だけが FQ URL を提供できます。

于 2009-03-24T01:04:24.347 に答える
2

次のようなものを使用できると思います:

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

ServletContext の port と contextPath を使用します。

于 2016-07-05T12:57:10.037 に答える