2010-11-25 21 views
101

メソッドrequest.getRequestURI()は、コンテキストパスを持つURIを返します。例えばコンテキストパスなしでリクエストURIを取得するにはどうすればよいですか?

アプリケーションのベースURL(すなわちコンテキストパスがmyappのある)http://localhost:8080/myapp/であり、Iは、http://localhost:8080/myapp/secure/usersためrequest.getRequestURI()を呼び出した場合、それは、/myapp/secure/usersを返します。

/secure/usersというこの部分のみを取得する方法はありますか?つまり、コンテキストパスのないURIはありますか?

+2

の可能重複[HttpServletRequestの中getRequestURIとgetPathInfoメソッドの違いは何?] (http://stackoverflow.com/questions/4931323/whats-the-difference-between-getrequesturi-and-getpathinfo-methods-in-httpservl) – Leonel

答えて

124

あなたはプレフィックスパターンにマッピングされているフロントcontollerサーブレット内であれば場合は、HttpServletRequest#getPathInfo()を使用してください。

String pathInfo = request.getPathInfo(); 
// ... 

あなたの例では、サーブレットは、/secureにマッピングされると仮定すると、これは典型的なフロントコントローラサーブレット内の唯一の関心のある情報になり/usersを返します。

しかし、サーブレットがサフィックスパターンでマップされている場合(URLの例では、このようなことは示されません)、実際にフィルタ内にある場合(呼び出されるサーブレットが必ずしもそうでない場合

HttpServletRequest request = (HttpServletRequest) req; 
String path = request.getRequestURI().substring(request.getContextPath().length()); 
// ... 
+0

'getServletPath()'の代わりにこれを使う理由はありますか?私はフィルタを書いていて、 'getPathInfo()'が 'null'を返すことに気づきましたが、' getServletPath() 'はパスからパスを引いた値を返します(リクエストディスパッチャーに渡すのに適しています)。 –

+0

@JasonC:応答として、getPathInfo()は、フロントコントローラサーブレットが接頭辞パターンにマップされていない場合はnullを返します。 – BalusC

+0

うん。私は意味:getServletPathよりもgetPathInfoを好む理由はありますか?他のスコアの高い答えの多くは、getServletPathも使用していません。それは、私にそれを疑わせるもので、なぜ私が疑問に思うのかです。私は私が取り組んでいるサーブレットプロジェクトを持っており、私は自分のスキルを磨くようにしています。 –

2

これを行う方法は、要求URIからのサーブレットコンテキストパスを休止することです。

String p = request.getRequestURI(); 
String cp = getServletContext().getContextPath(); 

if (p.startsWith(cp)) { 
    String.err.println(p.substring(cp.length()); 
} 

hereを読んでください。

-1

はあなただけで、たとえば「/ myappに」 を排除するためにsplitメソッドを使用することができかもしれませ:

string[] uris=request.getRequestURI().split("/"); 
string uri="/"+uri[1]+"/"+uris[2]; 
+2

これは、rootとしてアプリケーションをデプロイし、そのベースURLがhttp:// localhost:8080 /。この場合、request.getRequestURI()は "/ secure/user"を返し、分割メソッドはここで問題を引き起こします。コードは展開に依存するべきではありません。 – craftsman

60
request.getRequestURI().substring(request.getContextPath().length()) 
+0

恐ろしい!これはまさに私が探していたものです。 – craftsman

+4

+1これは、getPathInfoがnullなどの奇妙なことがあるため、これはgetPathInfoよりも優れた答えだと思います。さまざまなSpringコードはgetContextPathを行い、getPathInfoの代わりにURIからそれを削除します。 –

+2

これらのサーブレットはロードバランサにバインドされますか? –

11

getPathInfo()がNULLを返す:まだ決定し、そうgetPathInfo())がnullを返すことができ、その後、あなたの最善の策は、自分がいつもStringメソッドを使用して、コンテキスト・パスの長さに基づいて、要求URIをサブストリングすることです。ドキュメント内HttpServletRequest

このメソッドは、余分なパス情報がない場合はnullを返します。

フィルタとgetPathInfo()でコンテキストパスを使わずにファイルへのパスを取得する必要があります。あなたがフィルター内request.getPathInfo()を使用している場合、あなたは常に(少なくとも桟橋と)はnullを取得するように見えるhttpRequest.getServletPath()

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException 
{ 
    HttpServletRequest httpRequest = (HttpServletRequest) request; 
    HttpServletResponse httpResponse = (HttpServletResponse) response; 

    String newPath = parsePathToFile(httpRequest.getServletPath()); 
    ... 

} 
4

:だから私は、別の方法を使用します。

この簡潔無効バグ+応答は、私が考える問題を暗示:

https://issues.apache.org/bugzilla/show_bug.cgi?id=28323

私はそれは、サーブレットが要求を取得する前に実行してフィルタリングし、実際に関係している疑いがあります。これは、コンテナのバグ、または私が識別できなかった予想される動作かもしれません。

contextPathは利用できるので、fforwsソリューションはフィルタでも機能します。私は手でそれを行うには持っ好きではありませんが、実装が壊れているか

19

は春とあなたが行うことができます:

String path = new UrlPathHelper().getPathWithinApplication(request); 
+0

もちろん、UrlPathHelperのインスタンスを保持することは理にかなっています。クラスメンバ変数として... – James

関連する問題