サーブレット/JSPのヘッダ情報の取得方法

CGIではリクエストの解析やセキュリティに関する情報の取得のために、 ヘッダ情報を環境変数で受け取り、解析することが重要なテクニックでした。 サーブレット・JSPでも方法は異なりますが、 それらの用途や重要性は変わりません。ただしメカニズム的に CGIと異なるためにサポートしていないものもあります。

簡単にそれらを表示するJSP文書を作ってみました。

<%@ page language="java" contentType="text/html;charset=Shift_JIS" %>
<html><body>
クライアントのホスト名(REMOTE_HOST)=<%= request.getRemoteHost() %><br>
クライアントのIPアドレス(REMOTE_ADDR)=<%= request.getRemoteAddr() %><br>
要求されたURL(1)=<%= request.getRequestURI() %><br>
要求されたURL(2)=<%= request.getRequestURL().toString() %><br>
サーブレットパス=<%= request.getServletPath() %><br>
サーバ上のパス=<%= getServletContext().getRealPath(request.getServletPath()) %><br>
要求されたURLのパス(PATH_INFO)=<%= request.getPathInfo() %><br>
要求されたURLのサーバ上のパス(PATH_TRANSLATED)=<%= request.getPathTranslated() %><br>
要求のメソッド=<%= request.getMethod() %><br>
参照元のURL=<%= request.getHeader("Referer") %><br>
<a href="pathinfo.jsp">ここをクリック</a><br>
プロトコル(HTTP)=<%= request.getProtocol() %><br>
クエリー文字列=<%= request.getQueryString() %><br>
ポート番号=<%= String.valueOf(request.getServerPort()) %><br>
<br>
ファイルconfig.xmlのパス=<%= getServletContext().getRealPath("/config.xml") %><br>
ファイルconfig.xmlのURL=<%= request.getContextPath() + "/config.xml" %><br>
</body></html>

ここで HttpServletRequestのメソッドgetRequestURI()とgetRequestURL()の違いですが、 クライアントのWebブラウザから要求されたURLそのものは getRequestURL() の方です。 (ただし、クエリー文字列は含まれない) このメソッドはURLの加工用途を意識したとみえ、StringBufferを返す仕様なので、 そのtoString()メソッドで文字列に変換します。
このURL全体をサーブレットコンテナ(Webサーバ)上の物理パスに変換したものが getPathTranslated()です。
getRequestURI()は、 プロトコル(http://)、(サーバの)ホスト名、ポート番号の部分は含まれず、 getContextPath()、getServletPath()、getPathInfo()をこの順に連結したものと同じ値になります。 こちらもクエリー文字列は含まれません。
getPathInfo()は拡張パス情報(or追加パス情報)と呼ばれ、 サーブレット・パスより後ろ(クエリー文字列の前まで)の部分をあらわします。
なおJSPのURLにアクセスした場合は、getPathInfo()やgetPathTranslated()はnullを返すようです。

パスを生成する
処理結果やデータファイルをWebアプリケーションのホームディレクトリの下に生成するなどの目的で、 サーブレットやJSP文書から、 それらがその上で動作しているところのWebアプリケーションのコンテキストパスや、 サーバ・ファイルシステム上の絶対パスを取得することもよく行われます。 前者は、HttpServletRequest.getContextPath() でコンテキスト・パスを取得し、後ろに拡張パスを連結すれば可能です。 後者は、そのパスを引数に ServletContext.getRealPath(String) で変換すれば取得できます。

Server Side Java Index Top

(first uploaded 2002/09/21 last updated 2009/01/18, URANO398)

テレワークならECナビ Yahoo 楽天 LINEがデータ消費ゼロで月額500円〜!
無料ホームページ 無料のクレジットカード 海外格安航空券 海外旅行保険が無料! 海外ホテル