クッキーかURL書き換えかの判別

広告

セッションを管理するためのセッションIDの取得についてクッキー経由かURL書き換えによるものか二通りの方式がありますが、どちらの方式で利用されているかを判別することができます。判別することによってクッキー経由でのみサーブレットを利用させるなどの制限を行うことができます。

判別するには「HttpServletResponse」インターフェースで定義されている"isRequestedSessionIdFromCookie"メソッドと"isRequestedSessionIdFromUrl"メソッドを使います。

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メソッド:

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>

プログラムは下記の通りです。

SessionTest9.java

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書き換えかの判定

セッションが開始される時点ではクライアントからはクッキーもURL書き換えによるセッションID付与もありませんので両方とも「false」となります。次に「再表示」をクリックして下さい。(リンクはURL書き換えが行われています)。

クッキーかURL書き換えかの判定

リンクにはURL書き換えが行われているのでURLそのものにセッションIDは付与されているのですが、クッキーが有効になっているためURLのセッションIDではなくクッキーからのセッションID取得が行われています。その為、"isRequestedSessionIdFromCookie"メソッドだけがTRUEを返してきます。

※クッキーからセッションIDが取得できた為、次回以降はURL書き換えをしてもセッションIDが付与されなくなるのだと考えられます。

次にブラウザの設定でクッキーを無効にした状態で同じテストをしてみます。

クッキーかURL書き換えかの判定

セッション開始時はクッキーが有効でも無効でも結果は同じです。では「再表示」をクリックして下さい。

クッキーかURL書き換えかの判定

今度はクッキーが無効になっていますので、セッションIDはURLに付与されたものから取得されています。その為"isRequestedSessionIdFromURL"メソッドがTRUEを返してきます。

このようにセッション開始以降は、クッキー経由なのかURL書き換え経由なのかを判別することが可能となります。

( Written by Tatsuo Ikura )

関連記事 (一部広告含む)