web-dev-qa-db-ja.com

Spring MVCでルート/ベースURLを取得

Spring MVCでWebアプリケーションのルート/ベースURLを取得する最良の方法は何ですか?

ベースURL = http://www.example.com または http://www.example.com/VirtualDirectory

24
Mike Flynn

ベース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>
24
Nahn

独自のメソッドを作成して取得することもできます。

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;

}
14
nxhoaf

request.getRequestURL()。toString()。replace(request.getRequestURI()、request.getContextPath())

11
Salim Hamidi

使用したい

final String baseUrl = ServletUriComponentsBuilder.fromCurrentContextPath().build().toUriString();

エラーが発生しやすい文字列を連結および置換するのではなく、完全に構築されたURL、スキーム、サーバー名、およびサーバーポートを返します。

10
Enoobong

コントローラーでは、HttpServletRequest.getContextPath()を使用します。

JSPでは、Springのタグライブラリを使用:またはjstl

9
Wins

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();
5

単に:

String getBaseUrl(HttpServletRequest req) {
    return req.getScheme() + "://" + req.getServerName() + ":" + req.getServerPort() + req.getContextPath();
}
4
Karl.S
     @RequestMapping(value="/myMapping",method = RequestMethod.POST)
      public ModelandView myAction(HttpServletRequest request){

       //then follow this answer to get your Root url
     }

サーブレットのルートURl

Jspで必要な場合は、コントローラーに入り、ModelAndViewのオブジェクトとして追加します。

または、クライアント側で必要な場合は、javascriptを使用して取得します。 http://www.gotknowhow.com/articles/how-to-get-the-base-url-with-javascript

1
danny.lesnik

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>

参照 https://github.com/spring-projects/greenhouse/blob/master/src/main/webapp/WEB-INF/tags/urls/absoluteUrl.tag

0
fangxing

この質問に対する答えは次のとおりです。 ServletContextのみでアプリケーションのURLを見つける は、ルートURLが必要な特別な理由がない限り、代わりに相対URLを使用する理由を示しています。

0
jakobklamra

説明

この質問はかなり古いことはわかっていますが、このトピックについて私が見つけた唯一の質問なので、将来の訪問者のために私のアプローチを共有したいと思います。

WebRequestからベースURLを取得する場合は、次を実行できます。

_ServletUriComponentsBuilder.fromRequestUri(HttpServletRequest request);
_

これにより、スキーム( "http"または "https")、ホスト( "example.com")、ポート( "8080")およびパス( "/ some/path")が得られますが、fromRequest(request)はクエリパラメータも提供します。ただし、ベースURL(スキーム、ホスト、ポート)のみを取得するため、クエリパラメーターは必要ありません。

これで、次の行を使用してパスを削除できます。

_ServletUriComponentsBuilder.fromRequestUri(HttpServletRequest request).replacePath(null);
_

TLDR

最後に、ベース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)も必要ありません。

0
Mirko Brandt