Cookie
日本語 | クッキー |
英語 | cookie |
ふりがな | くっきー |
フリガナ | クッキー |
クッキーを管理するクラス。
J2EEに含まれるクラスのひとつ。パッケージも含めたクラス名はjavax.servlet.http.Cookie。
クッキーは「辞書」構造を持ち、「名前」で「値」を登録する形となる。
コンストラクタの第1引数で「名前」、第2引数で「値」を指定して作成する。
この「値」は、URLと同じく記号や日本語を使用できないため、URLEncoderクラス及びURLDecoderクラスを用いて「%xx」形式に変換してからセットする。
ただし、この「値」は最大4096バイトしか格納できない。「あ」を、UTF-8で「%xx」形式にエンコードすると「%E3%81%82%」となる。つまり「見た目1文字」が「9バイト」になるため、長文は保存できない。
クッキーの有効期限はsetMaxAge()メソッドでセットする。
単位は「秒」である。
HttpServletRequestインターフェイスのgetCookies()メソッドでWebサイトに関連づけられたクッキー一覧を取得することができる。クッキーは辞書構造だが、「名前」で任意のクッキーを取得するメソッドはないため注意。
HttpServletResponseインターフェイスのaddCookie()メソッドで追加することができる。その際、同じ「名前」のクッキーは上書きされる。
J2EEに含まれるクラスのひとつ。パッケージも含めたクラス名はjavax.servlet.http.Cookie。
クッキーは「辞書」構造を持ち、「名前」で「値」を登録する形となる。
コンストラクタの第1引数で「名前」、第2引数で「値」を指定して作成する。
この「値」は、URLと同じく記号や日本語を使用できないため、URLEncoderクラス及びURLDecoderクラスを用いて「%xx」形式に変換してからセットする。
ただし、この「値」は最大4096バイトしか格納できない。「あ」を、UTF-8で「%xx」形式にエンコードすると「%E3%81%82%」となる。つまり「見た目1文字」が「9バイト」になるため、長文は保存できない。
クッキーの有効期限はsetMaxAge()メソッドでセットする。
単位は「秒」である。
HttpServletRequestインターフェイスのgetCookies()メソッドでWebサイトに関連づけられたクッキー一覧を取得することができる。クッキーは辞書構造だが、「名前」で任意のクッキーを取得するメソッドはないため注意。
HttpServletResponseインターフェイスのaddCookie()メソッドで追加することができる。その際、同じ「名前」のクッキーは上書きされる。
参考サイト
// webapps/sample-servlet/WEB-INF/src/SampleServlet.java
// http://localhost:8080/sample-servlet/servlet/SampleServlet でアクセスできます。
// このサンプルプログラムは「サーブレット」の項目に書かれている準備を行ってから使用してください。
import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.net.URLDecoder;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* サーブレットのテスト。
*/
public class SampleServlet extends HttpServlet
{
/**
* リクエストとしてHTTPメソッドのGETが渡されるとこのメソッドが呼ばれます。
*/
public void doGet( HttpServletRequest request, HttpServletResponse response ) throws IOException, ServletException
{
// Content-Typeをセット。
response.setContentType( "text/html;charset=Windows-31J" );
// クッキーの名前。
final String NAME = "name";
// クッキーの「値」。
String value = "";
// クッキーの「値」(「%xx」)。
String encodedValue = "";
// クッキーの配列を取得します。
Cookie cookies[] = request.getCookies();
// 配列の中から、「名前」が"name"のものを探します。
if( cookies != null )
{
for( int iF1 = 0; iF1 < cookies.length; ++iF1 )
{
if( cookies[iF1].getName().equals( NAME ) )
{
// 見つかったので「値」を取っておきます。
encodedValue = cookies[iF1].getValue();
}
}
}
// クッキーの「値」は「%xx」形式の文字列と決まっているので、
// 変換して、そのあと文字列を追加して、再度変換します。
try
{
// 「%xx」→「テスト」
value = URLDecoder.decode( encodedValue, "UTF-8" );
// 追記します。
value += "/テスト";
// 「%xx」←「テスト」
encodedValue = URLEncoder.encode( value, "UTF-8" );
}
catch( UnsupportedEncodingException e )
{
// encode()メソッドの第2引数に渡した文字コードが、Javaの
// サポートしていない文字コードの場合にはこの
// UnsupportedEncodingException例外が投げられます。
e.printStackTrace();
}
// Cookieクラスを作成します。
// コンストラクタには名前と値を渡します。
Cookie cookie = new Cookie( NAME, encodedValue );
// クッキーの「有効期限」を60秒にします。
cookie.setMaxAge( 60 );
// クッキーを追加します。同じ名前のものがあれば上書きになります。
response.addCookie( cookie );
// HTML出力用のPrintWriterを取得します。
PrintWriter out = response.getWriter();
// HTMLを出力します。
out.println( "<HTML>" );
out.println( "<HEAD>" );
out.println( "<TITLE>サーブレットのテスト</TITLE>" );
out.println( "</HEAD>" );
out.println( "<BODY>" );
out.println( value );
out.println( "</BODY>" );
out.println( "</HTML>" );
// /テスト/テスト/テスト
// ……と、リロードするたびに増えていきます。
// でも、有効期限切れで1分経つと消えてしまいます。
}
}
// http://localhost:8080/sample-servlet/servlet/SampleServlet でアクセスできます。
// このサンプルプログラムは「サーブレット」の項目に書かれている準備を行ってから使用してください。
import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.net.URLDecoder;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* サーブレットのテスト。
*/
public class SampleServlet extends HttpServlet
{
/**
* リクエストとしてHTTPメソッドのGETが渡されるとこのメソッドが呼ばれます。
*/
public void doGet( HttpServletRequest request, HttpServletResponse response ) throws IOException, ServletException
{
// Content-Typeをセット。
response.setContentType( "text/html;charset=Windows-31J" );
// クッキーの名前。
final String NAME = "name";
// クッキーの「値」。
String value = "";
// クッキーの「値」(「%xx」)。
String encodedValue = "";
// クッキーの配列を取得します。
Cookie cookies[] = request.getCookies();
// 配列の中から、「名前」が"name"のものを探します。
if( cookies != null )
{
for( int iF1 = 0; iF1 < cookies.length; ++iF1 )
{
if( cookies[iF1].getName().equals( NAME ) )
{
// 見つかったので「値」を取っておきます。
encodedValue = cookies[iF1].getValue();
}
}
}
// クッキーの「値」は「%xx」形式の文字列と決まっているので、
// 変換して、そのあと文字列を追加して、再度変換します。
try
{
// 「%xx」→「テスト」
value = URLDecoder.decode( encodedValue, "UTF-8" );
// 追記します。
value += "/テスト";
// 「%xx」←「テスト」
encodedValue = URLEncoder.encode( value, "UTF-8" );
}
catch( UnsupportedEncodingException e )
{
// encode()メソッドの第2引数に渡した文字コードが、Javaの
// サポートしていない文字コードの場合にはこの
// UnsupportedEncodingException例外が投げられます。
e.printStackTrace();
}
// Cookieクラスを作成します。
// コンストラクタには名前と値を渡します。
Cookie cookie = new Cookie( NAME, encodedValue );
// クッキーの「有効期限」を60秒にします。
cookie.setMaxAge( 60 );
// クッキーを追加します。同じ名前のものがあれば上書きになります。
response.addCookie( cookie );
// HTML出力用のPrintWriterを取得します。
PrintWriter out = response.getWriter();
// HTMLを出力します。
out.println( "<HTML>" );
out.println( "<HEAD>" );
out.println( "<TITLE>サーブレットのテスト</TITLE>" );
out.println( "</HEAD>" );
out.println( "<BODY>" );
out.println( value );
out.println( "</BODY>" );
out.println( "</HTML>" );
// /テスト/テスト/テスト
// ……と、リロードするたびに増えていきます。
// でも、有効期限切れで1分経つと消えてしまいます。
}
}
// webapps/sample-servlet/WEB-INF/src/SampleServlet.java // http://localhost:8080/sample-servlet/servlet/SampleServlet でアクセスできます。 // このサンプルプログラムは「サーブレット」の項目に書かれている準備を行ってから使用してください。 import java.io.IOException; import java.io.PrintWriter; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.net.URLDecoder; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * サーブレットのテスト。 */ public class SampleServlet extends HttpServlet { /** * リクエストとしてHTTPメソッドのGETが渡されるとこのメソッドが呼ばれます。 */ public void doGet( HttpServletRequest request, HttpServletResponse response ) throws IOException, ServletException { // Content-Typeをセット。 response.setContentType( "text/html;charset=Windows-31J" ); // クッキーの名前。 final String NAME = "name"; // クッキーの「値」。 String value = ""; // クッキーの「値」(「%xx」)。 String encodedValue = ""; // クッキーの配列を取得します。 Cookie cookies[] = request.getCookies(); // 配列の中から、「名前」が"name"のものを探します。 if( cookies != null ) { for( int iF1 = 0; iF1 < cookies.length; ++iF1 ) { if( cookies[iF1].getName().equals( NAME ) ) { // 見つかったので「値」を取っておきます。 encodedValue = cookies[iF1].getValue(); } } } // クッキーの「値」は「%xx」形式の文字列と決まっているので、 // 変換して、そのあと文字列を追加して、再度変換します。 try { // 「%xx」→「テスト」 value = URLDecoder.decode( encodedValue, "UTF-8" ); // 追記します。 value += "/テスト"; // 「%xx」←「テスト」 encodedValue = URLEncoder.encode( value, "UTF-8" ); } catch( UnsupportedEncodingException e ) { // encode()メソッドの第2引数に渡した文字コードが、Javaの // サポートしていない文字コードの場合にはこの // UnsupportedEncodingException例外が投げられます。 e.printStackTrace(); } // Cookieクラスを作成します。 // コンストラクタには名前と値を渡します。 Cookie cookie = new Cookie( NAME, encodedValue ); // クッキーの「有効期限」を60秒にします。 cookie.setMaxAge( 60 ); // クッキーを追加します。同じ名前のものがあれば上書きになります。 response.addCookie( cookie ); // HTML出力用のPrintWriterを取得します。 PrintWriter out = response.getWriter(); // HTMLを出力します。 out.println( "<HTML>" ); out.println( "<HEAD>" ); out.println( "<TITLE>サーブレットのテスト</TITLE>" ); out.println( "</HEAD>" ); out.println( "<BODY>" ); out.println( value ); out.println( "</BODY>" ); out.println( "</HTML>" ); // /テスト/テスト/テスト // ……と、リロードするたびに増えていきます。 // でも、有効期限切れで1分経つと消えてしまいます。 } }