クッキーの取り出し

広告

ここではクライアントから送信されたクッキーを取り出してみましょう。

クッキーは、クッキー名や値の他に、クッキーが作成されたWebサーバのドメイン情報などを合わせて保存します。そして同じWebサーバに再度アクセスした場合に、そのWebサーバから発行されたクッキーがあれば保存していたクッキーをサーバへ送信します。

クライアントから送信されてきたクッキーは、サーブレットの"doGet"や"doPost"メソッドの引数である「HttpServletRequest」インターフェースのオブジェクトから取り出すことが出来ます。"getCookies"メソッドを使います。

Returns an array containing all of the Cookie objects the client sent
with this request. This method returns null if no cookies were sent. 

Returns:
  an array of all the Cookies included with this request, or null if 
    the request has no cookies

クライアントから送られてきた全てのクッキーをCookieクラスのオブジェクトの配列として取得します。クッキーは同一のサーバから違うクッキー名を使って複数のクッキーをクライアントに保存することが出来ますので、クライアントから送られてくるクッキーも1つとは限りません。

もしクッキーがクライアントに保存されておらずサーバに送られてきたクッキーが存在しない場合はnullを返します。

特定のクッキーの検索

取得したCookieクラスのオブジェクトの配列の中から、特定のクッキー名を持つクッキーを探すにはクッキー名を1つ1つ調べるしかありません。「Cookie」クラスで用意されている"getName"メソッドを使います。

Returns the name of the cookie. The name cannot be changed after creation. 

Returns:
  a String specifying the cookie's name

このメソッドを使って1つ1つクッキー名を取得し、取得したいクッキーを検索します。

クッキーの値を取得

目的のクッキーが見つかれば、今度は「Cookie」クラスで用意されている"getValue"メソッドで設定されている値を取得することが出来ます。

Returns the value of the cookie. 

Returns:
  a String containing the cookie's present value

よって実際の使い方は下記のような感じとなります。

public void doGet(HttpServletRequest request, HttpServletResponse response)
  throws IOException, ServletException{

  response.setContentType("text/html; charset=Shift_JIS");
  PrintWriter out = response.getWriter();

  Cookie cookie[] = request.getCookies();

  if (cookie != null){
    for (int i = 0 ; i < cookie.length ; i++){
      if (cookie[i].getName().equals("visited")){
        String val = cookie[i].getValue();
      }
    }
  }
}

サンプルプログラム

では一度試してみます。

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>cookietest</servlet-name>
    <servlet-class>CookieTest1</servlet-class>
  </servlet>

  <servlet>
    <servlet-name>dispvalue</servlet-name>
    <servlet-class>DispValue1</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>cookietest</servlet-name>
    <url-pattern>/cookietest</url-pattern>
  </servlet-mapping>

  <servlet-mapping>
    <servlet-name>dispvalue</servlet-name>
    <url-pattern>/dispvalue</url-pattern>
  </servlet-mapping>
</web-app>

プログラムは下記のようになります。

CookieTest1.java

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

public class CookieTest1 extends HttpServlet {
  public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException{

    response.setContentType("text/html; charset=Shift_JIS");
    PrintWriter out = response.getWriter();

    Cookie cookie = new Cookie("visited", "1");
    response.addCookie(cookie);

    out.println("<html>");
    out.println("<head>");
    out.println("<title>クッキーテスト</title>");
    out.println("</head>");
    out.println("<body>");
    out.println("<p>クッキーを保存しました</p>");

    out.println("<a href=¥"/cookie/dispvalue¥">クッキーを表示</a>");

    out.println("</body>");
    out.println("</html>");
  }
}

DispValue1.java

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

public class DispValue1 extends HttpServlet {
  public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException{

    response.setContentType("text/html; charset=Shift_JIS");
    PrintWriter out = response.getWriter();

    Cookie cookie[] = request.getCookies();

    out.println("<html>");
    out.println("<head>");
    out.println("<title>クッキーを表示</title>");
    out.println("</head>");
    out.println("<body>");

    if (cookie != null){
      for (int i = 0 ; i < cookie.length ; i++){
        if (cookie[i].getName().equals("visited")){
          String val = cookie[i].getValue();

          out.println("<p>");
          out.println(cookie[i].getName());
          out.println("=");
          out.println(val);
          out.println("</p>");
        }
      }
    }else{
      out.println("<p>クッキーが見つかりません</p>");
    }

    out.println("<a href=¥"/cookie/dispvalue¥">クッキーを再表示</a>");

    out.println("</body>");
    out.println("</html>");
  }
}

上記をコンパイル後に「d:¥servlet-sample¥cookie¥WEB-INF¥classes¥」ディレクトリにクラスファイルを移動した後で、ブラウザで「http://localhost:8080/cookie/cookietest」へアクセスしてみます。

クッキーの取得

「クッキーを表示」をクリックして下さい。

クッキーの取得

上記のように表示されればクライアントからのクッキーを取得出来ています。

( Written by Tatsuo Ikura )