値の再設定

広告

クッキーを取り出した後で、別の値を設定してみます。

「Cookie」クラスで用意されている"setValue"メソッドで既存のクッキーに別の値を設定できます。

Assigns a new value to a cookie after the cookie is created. If you use 
a binary value, you may want to use BASE64 encoding. 

With Version 0 cookies, values should not contain white space, brackets, 
parentheses, equals signs, commas, double quotes, slashes, question 
marks, at signs, colons, and semicolons. Empty values may not behave the 
same way on all browsers. 

Parameters:
  newValue - a String specifying the new value

新しい値を設定したら、改めて"addCookie"メソッドを使ってクライアントに書き込む必要があります。

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

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

  response.setContentType("text/html; charset=Shift_JIS");
  PrintWriter out = response.getWriter();
  request.setCharacterEncoding("Shift-JIS");

  Cookie cookie[] = request.getCookies();
  Cookie visitedCookie = null;

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

    if (visitedCookie != null){
      int visited = Integer.parseInt(visitedCookie.getValue());

      visitedCookie.setValue(Integer.toString(visited + 1));
      response.addCookie(visitedCookie);
    }
  }
}

サンプルプログラム

では一度試してみます。

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>CookieTest2</servlet-class>
  </servlet>

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

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

CookieTest2.java

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

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

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

    out.println("<html>");
    out.println("<head>");
    out.println("<title>クッキーテスト</title>");
    out.println("</head>");
    out.println("<body>");

    Cookie cookie[] = request.getCookies();
    Cookie visitedCookie = null;

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

      if (visitedCookie != null){
        int visited = Integer.parseInt(visitedCookie.getValue()) + 1;

        out.println("<p>");
        out.println(visited);
        out.println("回目の訪問です。</p>");

        visitedCookie.setValue(Integer.toString(visited));
        response.addCookie(visitedCookie);
      }else{
        out.println("<p>初回の訪問です。</p>");

        Cookie newCookie = new Cookie("visited", "1");
        response.addCookie(newCookie);
      }
    }else{
      out.println("<p>初回の訪問です。</p>");

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

    out.println("<a href=¥"/cookie/cookietest¥">再表示</a>");

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

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

クッキーの再設定

「再表示」をクリックすると訪問回数が増加していきます。

クッキーの再設定

クッキーの再設定

( Written by Tatsuo Ikura )