Spring MVCでWebアプリケーションのルート/ベースURLを取得する最良の方法は何ですか?
ベースURL = http://www.example.com または http://www.example.com/VirtualDirectory
ベースURLが「 http://www.example.com 」の場合、次を使用して「www.example.com」部分を取得します、「http://」なし:
コントローラーから:
@RequestMapping(value = "/someURL", method = RequestMethod.GET)
public ModelAndView doSomething(HttpServletRequest request) throws IOException{
//Try this:
request.getLocalName();
// or this
request.getLocalAddr();
}
JSPから:
文書の上にこれを宣言します:
<c:set var="baseURL" value="${pageContext.request.localName}"/> //or ".localAddr"
次に、それを使用するには、変数を参照します。
<a href="http://${baseURL}">Go Home</a>
独自のメソッドを作成して取得することもできます。
public String getURLBase(HttpServletRequest request) throws MalformedURLException {
URL requestURL = new URL(request.getRequestURL().toString());
String port = requestURL.getPort() == -1 ? "" : ":" + requestURL.getPort();
return requestURL.getProtocol() + "://" + requestURL.getHost() + port;
}
request.getRequestURL()。toString()。replace(request.getRequestURI()、request.getContextPath())
使用したい
final String baseUrl = ServletUriComponentsBuilder.fromCurrentContextPath().build().toUriString();
エラーが発生しやすい文字列を連結および置換するのではなく、完全に構築されたURL、スキーム、サーバー名、およびサーバーポートを返します。
コントローラーでは、HttpServletRequest.getContextPath()
を使用します。
JSPでは、Springのタグライブラリを使用:またはjstl
UriCompoenentsBuilder
を注入するか:
@RequestMapping(yaddie yadda)
public void doit(UriComponentBuilder b) {
//b is pre-populated with context URI here
}
。または自分で作ってください(サリムスの回答と同様):
// Get full URL (http://user:[email protected]/root/some?k=v#hey)
URI requestUri = new URI(req.getRequestURL().toString());
// and strip last parts (http://user:[email protected]/root)
URI contextUri = new URI(requestUri.getScheme(),
requestUri.getAuthority(),
req.getContextPath(),
null,
null);
その後、そのURIからUriComponentsBuilderを使用できます。
// http://user:[email protected]/root/some/other/14
URI complete = UriComponentsBuilder.fromUri(contextUri)
.path("/some/other/{id}")
.buildAndExpand(14)
.toUri();
単に:
String getBaseUrl(HttpServletRequest req) {
return req.getScheme() + "://" + req.getServerName() + ":" + req.getServerPort() + req.getContextPath();
}
@RequestMapping(value="/myMapping",method = RequestMethod.POST)
public ModelandView myAction(HttpServletRequest request){
//then follow this answer to get your Root url
}
Jspで必要な場合は、コントローラーに入り、ModelAndViewのオブジェクトとして追加します。
または、クライアント側で必要な場合は、javascriptを使用して取得します。 http://www.gotknowhow.com/articles/how-to-get-the-base-url-with-javascript
JSPで
<c:set var="scheme" value="${pageContext.request.scheme}"/>
<c:set var="serverPort" value="${pageContext.request.serverPort}"/>
<c:set var="port" value=":${serverPort}"/>
<a href="${scheme}://${pageContext.request.serverName}${port}">base url</a>
この質問に対する答えは次のとおりです。 ServletContextのみでアプリケーションのURLを見つける は、ルートURLが必要な特別な理由がない限り、代わりに相対URLを使用する理由を示しています。
この質問はかなり古いことはわかっていますが、このトピックについて私が見つけた唯一の質問なので、将来の訪問者のために私のアプローチを共有したいと思います。
WebRequestからベースURLを取得する場合は、次を実行できます。
_ServletUriComponentsBuilder.fromRequestUri(HttpServletRequest request);
_
これにより、スキーム( "http"または "https")、ホスト( "example.com")、ポート( "8080")およびパス( "/ some/path")が得られますが、fromRequest(request)
はクエリパラメータも提供します。ただし、ベースURL(スキーム、ホスト、ポート)のみを取得するため、クエリパラメーターは必要ありません。
これで、次の行を使用してパスを削除できます。
_ServletUriComponentsBuilder.fromRequestUri(HttpServletRequest request).replacePath(null);
_
最後に、ベースURLを取得するためのワンライナーは次のようになります。
_//request URL: "http://example.com:8080/some/path?someParam=42"
String baseUrl = ServletUriComponentsBuilder.fromRequestUri(HttpServletRequest request)
.replacePath(null)
.build()
.toUriString();
//baseUrl: "http://example.com:8080"
_
HttpServletRequest
が存在しないコントローラの外部またはどこかでこれを使用する場合は、単に置き換えることができます
_ServletUriComponentsBuilder.fromRequestUri(HttpServletRequest request).replacePath(null)
_
と
_ServletUriComponentsBuilder.fromCurrentContextPath()
_
これは、スプリングのHttpServletRequest
を介してRequestContextHolder
を取得します。既にスキーム、ホスト、ポートのみであるため、replacePath(null)
も必要ありません。