セッションパラメータを使う場合のURL書き換え (URL Rewrite) - Java

概要

こちらの記事ではセッションオブジェクトを利用したカウンタを紹介しました。 現代的なブラウザでは特殊な設定をしない限りはセッションの判定(セッション追跡)にCookieが使われます。 Cookieが使えない端末やブラウザからのアクセスの場合にはセッションの判定(セッション追跡)はURLに付加されたセッションパラメータを用います。 セッションパラメータは、jsessionid=(セッションID) の形式でURLパラメータとして付加されます。
セッションIDをURLのパラメータに付加する場合はサーブレットからリンクを生成する際に、セッションパラメータを付加してリンク生成をする必要があります。 この記事ではセッションIDをパラメータに付加するリンク生成方法を紹介します。

コード (サーブレット:GetURLRewriteingCounter.java)

package webApplication10;

import java.io.*;
import java.net.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class GetURLRewritingCounter extends HttpServlet {
  /** Handles the HTTP <code>GET</code> method.
   * @param request servlet request
   * @param response servlet response
   */
  protected void doGet(HttpServletRequest req, HttpServletResponse res)
          throws ServletException, IOException {
    String message = null;
    Integer counter = null;
    HttpSession session = req.getSession(false);

    //セッションオブジェクトの獲得確認
    if (session == null || session.getAttribute("counter") == null) {
      //セッションが取得できなければ新規作成
      session = req.getSession(true);
      message = "You are first Access";
      counter = new Integer(0);
    } else {
      //セッションが取得できた場合はカウンタを取り出す
      message = "Welcome again";
      counter = (Integer) session.getAttribute("counter");
    }

    //カウンタをインクリメントしセッションオブジェクトに保存する
    counter = new Integer(counter.intValue() + 1);
    session.setAttribute("counter", counter);
    res.setContentType("text/html; charset=ISO-2022-JP");

    PrintWriter out = res.getWriter();
    out.println("<HTML>");
    out.println("<HEAD>");
    out.println("<TITLE>Get URL Rewriting Counter</TITLE>");
    out.println("</HEAD>");
    out.println("<BODY>");
    out.println("<H1>Get URLRewriting Counter</H1>");
    out.println("<BR><HR><BR>");
    out.println("<H2><FONT size=\"20\">" + message + "</FONT></H2>");
    out.println("<P>You have hit this page " + counter + " times</P>");
    out.println("<A href=" + res.encodeURL("./GetURLRewritingCounter") + ">click</A>");
    out.println("</BODY>");
    out.println("</HTML>");

    out.close();
  }

  /** Handles the HTTP <code>POST</code> method.
   * @param request servlet request
   * @param response servlet response
   */
  protected void doPost(HttpServletRequest request, HttpServletResponse response)
          throws ServletException, IOException {
  }

  /** Returns a short description of the servlet. */
  public String getServletInfo() {
    return "Short description";
  }
}

解説

セッションオブジェクトの処理についてはこちらの記事を参照してください。

サーブレットが返すHTMLのリンク中にセッションIDを含めたパラメータを追加する場合はHttpResponse.encodeURL()メソッドを用います。ブラウザがCookieをサポートしているかを判別し、Cookieをサポートしていない場合はURLの後ろにセッション追跡のためのjsessionidパラメータを付加します。
  out.println("<A href=" + res.encodeURL("./GetURLRewritingCounter") + ">click</A>");

コード (HTMLファイル)

<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
  "http://www.w3.org/TR/html4/loose.dtd">
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>JSP Page</title>
  </head>
  <body>
    <h1>JSP Page</h1>
    <a href="GetURLRewritingCounter">Click!!</a>
  </body>
</html>

コード (web.xml)

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" 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">
  <servlet>
    <servlet-name>GetURLRewritingCounter</servlet-name>
    <servlet-class>webApplication10.GetURLRewritingCounter</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>GetURLRewritingCounter</servlet-name>
    <url-pattern>/GetURLRewritingCounter</url-pattern>
  </servlet-mapping>
  <session-config>
    <session-timeout>30</session-timeout>
  </session-config>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>
著者
iPentecのプログラマー、最近はAIの積極的な活用にも取り組み中。
とっても恥ずかしがり。
最終更新日: 2023-12-20
作成日: 2011-02-11
iPentec all rights reserverd.