アクセス制御用のパスを解決し、返却する。
- PathInfoが"/"で始まる場合は、ServletPathにPathInfoを連結して返す。
- PathInfoが"/"で始まらない場合(PathInfoがnullの場合も含む)は、ServletPathのみを返す。
- ただし、RequestURIの先頭からContextPathを除去した結果が、「/」または空文字列となる場合、
ServletPathやPathInfoにかかわらず、それぞれ(「/」や空文字列)を返す。
※万一ServletPathとしてnullが得られた場合、空文字列と同じ扱いとする。
※引数のrequestにnullが渡された場合はnullを返却する。
注意1:
APサーバによっては、パスを細工せずに普通にコンテキストルートにアクセスしても、
このメソッドの戻り値が「/」や空文字列以外の文字列(web.xmlで設定したwelcome-fileの先頭に「/」を追加したパス等)になりうる。
(RequestURI-ContextPathで演算しても、ServletPath+PathInfoで演算しても、「/」や空文字列にならないAPサーバが存在する。)
したがって、コンテキストルートに対してアクセス制限をかけたくない場合は、
本番運用で使用予定のAPサーバを使用し、普通にコンテキストルートへアクセスした場合に
このメソッドが返すパスを確認し、そのパスにアクセス制限をかけないよう設定あるいは実装する必要がある。
普通にコンテキストルートへアクセスする際のURL:
- http://host:port/contextRoot
- http://host:port/contextRoot/
- http://host:port/contextRoot/;jsessionid=xxx
(Cookieが使用できないクライアントに対し、
コンテキストルートへのリンクとして「/contextRoot/;jsessionid=xxx」の形式のパスを出力している場合)
注意2:
APサーバによっては、パスを細工することで、
このメソッドの戻り値が、普通にコンテキストルートにアクセスしたときと同じ文字列にならない条件で、
コンテキストルートへのアクセスが可能である。
(このメソッドの戻り値が、「/」、空文字列、welcome-fileの先頭に「/」を追加したパスのいずれにもならなくても、
welcome-fileの先頭に「/」を追加したパスが実行される場合がある。)
したがって、コンテキストルートに対してアクセス制限をかけたい場合は、
各種APサーバに最適化した、別の実装クラスを用意しなければならない。
(普通は、コンテキストルートは誰でもアクセスできるようにするため、
コンテキストルートに対してアクセス制限をかけることはない。)
注意3:
PathInfoを使用するServletや、そこで使用しているクラスが、PathInfoをそのまま使用せず、
PathInfoの正規化等の編集を行って解釈している場合のように、
1つのリソースにアクセスするためのPathInfoが複数通り存在する場合、
この実装が返却するパスでは、アクセス制御が正確に行えない場合がある。
(例えば、/PathInfo1だけでなく/PathInfo2も/PathInfo1と同じであるとServletが解釈する場合、
/ServletPath/PathInfo1をアクセス制限しても、/ServletPath/PathInfo2が抜け道となる。)
このようなケースでアクセス制御したい場合は、
特定のServletPathの際にはServletと同じロジックでPathInfoを解釈するよう、
本メソッドをオーバーライドするか、
1つのリソースにアクセスするためのPathInfoが複数通り存在しないよう
Servletを実装する必要がある。
(例えば、PathInfoを正規化してアクセスするクラスを利用するときには、
正規化前後でPathInfoの値が異なっていれば不正なPathInfoと判断する等。)