- Home ›
- サーブレット/JSP入門 ›
- セッション管理
クッキーかURL書き換えかの判別
セッションを管理するためのセッションIDの取得についてクッキー経由かURL書き換えによるものか二通りの方式がありますが、どちらの方式で利用されているかを判別することができます。判別することによってクッキー経由でのみサーブレットを利用させるなどの制限を行うことができます。
判別するには「HttpServletResponse」インターフェースで定義されている"isRequestedSessionIdFromCookie"メソッドと"isRequestedSessionIdFromUrl"メソッドを使います。
isRequestedSessionIdFromCookieメソッド:
isRequestedSessionIdFromCookie public boolean isRequestedSessionIdFromCookie()
Checks whether the requested session ID came in as a cookie. Returns: true if the session ID came in as a cookie; otherwise, false
isRequestedSessionIdFromUrlメソッド:
isRequestedSessionIdFromURL public boolean isRequestedSessionIdFromURL()
Checks whether the requested session ID came in as part of the request URL. Returns: true if the session ID came in as part of a URL; otherwise, false
クッキー経由の場合には"isRequestedSessionIdFromCookie"がTRUEを、URL書き換え経由の場合には"isRequestedSessionIdFromURL"がTRUEを返してくれます。
サンプルプログラム
では試してみます。
web.xmlファイルは下記のようにしました。
<?xml version="1.0" encoding="ISO-8859-1"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> <servlet> <servlet-name>sessiontest</servlet-name> <servlet-class>SessionTest9</servlet-class> </servlet> <servlet-mapping> <servlet-name>sessiontest</servlet-name> <url-pattern>/sessiontest</url-pattern> </servlet-mapping> </web-app>
プログラムは下記の通りです。
import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import java.util.Date; public class SessionTest9 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{ response.setContentType("text/html; charset=Shift_JIS"); PrintWriter out = response.getWriter(); HttpSession session = request.getSession(false); out.println("<html>"); out.println("<head>"); out.println("<title>セッションテスト</title>"); out.println("</head>"); out.println("<body>"); if (session == null){ out.println("<p>セッションを開始します</p>"); session = request.getSession(true); }else{ out.println("<p>セッション中です</p>"); } boolean cookie_flag = request.isRequestedSessionIdFromCookie(); boolean url_flag = request.isRequestedSessionIdFromURL(); out.println("<p>"); out.println("FromCookie : " + cookie_flag + "<br>"); out.println("FromURL : " + url_flag); out.println("</p>"); String url = "/session/sessiontest"; String eURL = response.encodeURL(url); out.println("<a href=\"" + eURL + "\">再表示</a>"); out.println("</body>"); out.println("</html>"); } }
上記をコンパイル後に「d:\servlet-sample\session\WEB-INF\classes\」ディレクトリにクラスファイルを移動した後で、ブラウザで「http://localhost:8080/session/sessiontest」へアクセスしてみます。クッキーは有効にしてあります。
セッションが開始される時点ではクライアントからはクッキーもURL書き換えによるセッションID付与もありませんので両方とも「false」となります。次に「再表示」をクリックして下さい。(リンクはURL書き換えが行われています)。
リンクにはURL書き換えが行われているのでURLそのものにセッションIDは付与されているのですが、クッキーが有効になっているためURLのセッションIDではなくクッキーからのセッションID取得が行われています。その為、"isRequestedSessionIdFromCookie"メソッドだけがTRUEを返してきます。
※クッキーからセッションIDが取得できた為、次回以降はURL書き換えをしてもセッションIDが付与されなくなるのだと考えられます。
次にブラウザの設定でクッキーを無効にした状態で同じテストをしてみます。
セッション開始時はクッキーが有効でも無効でも結果は同じです。では「再表示」をクリックして下さい。
今度はクッキーが無効になっていますので、セッションIDはURLに付与されたものから取得されています。その為"isRequestedSessionIdFromURL"メソッドがTRUEを返してきます。
このようにセッション開始以降は、クッキー経由なのかURL書き換え経由なのかを判別することが可能となります。
( Written by Tatsuo Ikura )
著者 / TATSUO IKURA
これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。