12_サーブレットCookies処理

105213 ワード

サーブレットCookies処理
Cookiesはクライアントコンピュータに格納されたテキストファイルであり、様々な追跡情報が保持されている.Javaサーブレットは明らかにHTTP Cookiesをサポートしている.
ユーザーを識別するには、次の3つのステップがあります.
サーバスクリプトは、ブラウザにCookiesのセットを送信します.例えば、名前、年齢、識別番号などです.
ブラウザは、将来の使用に備えて、これらの情報をローカルコンピュータに格納します.
次のブラウザがWebサーバに要求を送信すると、ブラウザはこれらのCookies情報をサーバに送信し、サーバはこれらの情報を使用してユーザーを識別します.
この章では、Cookiesの設定またはリセット方法、アクセス方法、削除方法について説明します.
Cookie剖析
Cookiesは通常HTTPヘッダ情報に設定されます(JavaScriptはブラウザに直接Cookieを設定することもできますが).Cookieのサーブレットを設定すると、次のヘッダ情報が送信されます.
HTTP/1.1 200 OK
Date: Fri, 04 Feb 2000 21:03:38 GMT
Server: Apache/1.3.9 (UNIX) PHP/4.0b3
Set-Cookie: name=xyz; expires=Friday, 04-Feb-07 22:03:38 GMT; 
                 path=/; domain=w3cschool.cc
Connection: close
Content-Type: text/html

ご覧のように、Set-Cookieヘッダには、名前値ペア、GMT日付、パス、ドメインが含まれています.名前と値はURLで符号化されます.expiresフィールドは、ブラウザに所定の時間と日付の後にCookieを「忘れる」ように指示するコマンドです.
ブラウザがCookiesを格納するように構成されている場合は、有効期限までこの情報が保持されます.ユーザーのブラウザがCookieのパスとドメインに一致するページを指す場合、Cookieはサーバに再送信されます.ブラウザのヘッダ情報は次のようになります.
GET / HTTP/1.0
Connection: Keep-Alive
User-Agent: Mozilla/4.6 (X11; I; Linux 2.2.6-15apmac ppc)
Host: zink.demon.co.uk:1126
Accept: image/gif, */*
Accept-Encoding: gzip
Accept-Language: en
Accept-Charset: iso-8859-1,*,utf-8
Cookie: name=xyz

サーブレットはリクエストメソッドでrequestできる.getCookies()はCookieにアクセスし、このメソッドはCookieオブジェクトの配列を返します.
サーブレットCookiesメソッド
以下に、サーブレットでCookiesを操作する際に使用できる有用なメソッドのリストを示します.
シーケンス番号
方法&説明
1
public void setDomain(String pattern)この方法は、w 3 cschoolのようなクッキーが適用するドメインを設定する.cc.
2
public String getDomain()この方法は、w 3 cschoolのようなクッキーが適用するドメインを取得する.cc.
3
public void setMaxAge(int expiry)この方法では、クッキーの有効期限が秒単位で設定されます.このように設定しないと、クッキーは現在のセッションでのみ有効になります.
4
public int getMaxAge()このメソッドはcookieの最大生存サイクル(秒単位)を返し、デフォルトでは-1はブラウザが閉じるまでcookieが継続することを示します.
5
public String getName()メソッドはクッキーの名前を返します.名前は作成後は変更できません.
6
public void setValue(String newValue)このメソッドはクッキーに関連付けられた値を設定します.
7
public String getValue()このメソッドは、クッキーに関連付けられた値を取得します.
8
public void setPath(String uri)この方法はクッキーに適用されるパスを設定します.パスを指定しない場合は、現在のページと同じディレクトリの下にある(サブディレクトリの下を含む)すべてのURLがクッキーを返します.
9
public String getPath()このメソッドは、クッキーに適用されるパスを取得します.
10
public void setSecure(boolean flag)この方法は、クッキーが暗号化された(すなわちSSL)接続のみで送信されるべきかどうかを示すブール値を設定する.
11
public void setComment(String purpose)この方法は、クッキーの目的を記述する注釈を規定する.このコメントは、ブラウザがユーザーにクッキーを表示するときに便利です.
12
public String getComment()このメソッドは、クッキーの目的を記述するコメントを返し、クッキーにコメントがない場合nullを返します.
サーブレットによるCookiesの設定
サーブレットによるCookiesの設定には、次の3つのステップがあります.
(1)Cookieオブジェクトを作成する:cookie名とcookie値を持つCookieコンストラクタを呼び出すことができ、cookie名とcookie値は文字列です.
Cookie cookie = new Cookie("key","value");

名前にしても値にしても、スペースまたは以下の文字は含めるべきではありません.
[ ] ( ) = , " / ? @ : ;

(2)最大生存期間の設定:setMaxAgeメソッドを使用して、クッキーが有効な時間(秒単位)を維持できるように指定できます.次に、最長有効期間24時間のクッキーを設定します.
cookie.setMaxAge(60*60*24); 

(3)HTTP応答ヘッダにCookieを送信:responseを使用することができる.addCookieは、以下に示すように、HTTP応答ヘッダのCookiesを追加する.
response.addCookie(cookie);

≪インスタンス|Instance|emdw≫
フォームデータのインスタンスを変更し、名前と姓にCookiesを設定します.
//       java  
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
 
//    HttpServlet  
public class HelloForm extends HttpServlet {
 
  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
            throws ServletException, IOException
  {
      //          Cookies      
      Cookie firstName = new Cookie("first_name",
                      request.getParameter("first_name"));
      Cookie lastName = new Cookie("last_name",
                      request.getParameter("last_name"));

      //     Cookies         24    
      firstName.setMaxAge(60*60*24); 
      lastName.setMaxAge(60*60*24); 

      //           Cookies
      response.addCookie( firstName );
      response.addCookie( lastName );

      //         
      response.setContentType("text/html;charset=UTF-8");
 
      PrintWriter out = response.getWriter();
      String title = "   Cookies   ";
      String docType =
      "<!doctype html public \"-//w3c//dtd html 4.0 " +
      "transitional//en\">
"
; out.println(docType + "<html>
"
+ "<head><title>" + title + "</title></head>
"
+ "<body bgcolor=\"#f0f0f0\">
"
+ "<h1 align=\"center\">" + title + "</h1>
"
+ "<ul>
"
+ " <li><b> </b>:" + request.getParameter("first_name") + "
</li>"
+ " <li><b> </b>:" + request.getParameter("last_name") + "
</li>"
+ "</ul>
"
+ "</body></html>"); } }

上のサーブレットHelloFormをコンパイルし、web.xmlファイルに適切なエントリを作成し、最後に次のHTMLページを試してサーブレットを呼び出します.
 
<html>
<head>
<meta charset="utf-8">
<title>    (runoob.com)</title>
</head>
<body>
<form action="HelloForm" method="GET"><input type="text" name="first_name">
<br /><input type="text" name="last_name" />
<input type="submit" value="  " />
</form>
</body>
</html>

上のHTMLの内容をファイルhelloに保存します.htmで/webapps/ROOTディレクトリに入れます.アクセス時http://localhost:8080/Hello.htmの場合、上記フォームの実際の出力は以下のようになります.
名前:
姓:
名前と姓を入力して[コミット](Submit)ボタンをクリックすると、名前と姓が画面に表示され、firstNameとlastNameの2つのCookiesが設定され、次回コミットボタンを押すと、この2つのCookiesがサーバに返されます.
次のセクションでは、WebアプリケーションでこれらのCookiesにアクセスする方法について説明します.
サーブレットによるCookiesの読み込み
Cookiesを読み込むには、HttpServiceRequestのgetCookies()メソッドを呼び出してjavaxを作成する必要があります.servlet.http.Cookieオブジェクトの配列.次に配列をループし、getName()メソッドとgetValue()メソッドを使用して各クッキーと関連する値にアクセスします.
≪インスタンス|Instance|emdw≫
上記の例で設定したCookiesを読みましょう
//       java  
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
 
//    HttpServlet  
public class ReadCookies extends HttpServlet {
 
  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
            throws ServletException, IOException
  {
      Cookie cookie = null;
	  Cookie[] cookies = null;
      //          Cookies    
      cookies = request.getCookies();
      
      //         
      response.setContentType("text/html;charset=UTF-8");
 
      PrintWriter out = response.getWriter();
      String title = "Reading Cookies Example";
      String docType =
      "<!doctype html public \"-//w3c//dtd html 4.0 " +
      "transitional//en\">
"
; out.println(docType + "<html>
"
+ "<head><title>" + title + "</title></head>
"
+ "<body bgcolor=\"#f0f0f0\">
"
); if( cookies != null ){ out.println("<h2> Cookies </h2>"); for (int i = 0; i < cookies.length; i++){ cookie = cookies[i]; out.print(" :" + cookie.getName( ) + ","); out.print(" :" + cookie.getValue( )+" <br/>"); } }else{ out.println("<h2> Cookies</h2>"); } out.println("</body>"); out.println("</html>"); } }

上のサーブレットReadCookiesをコンパイルし、web.xmlファイルに適切なエントリを作成します.first_を設定した場合name cookieは「John」、last_nameクッキーは「Player」で、実行を試みますhttp://localhost:8080/ReadCookiesを選択すると、次の結果が表示されます.
Cookies名と値名の検索:first_name,値:John名:last_name,値:Player
サーブレットによるCookiesの削除
Cookiesを削除するのは簡単です.クッキーを削除するには、次の3つの手順に従います.
既存のクッキーを読み込み、クッキーオブジェクトに格納します.
setMaxAge()メソッドを使用してクッキーの年齢をゼロに設定し、既存のクッキーを削除します.
このクッキーをレスポンスヘッダに追加します.
≪インスタンス|Instance|emdw≫
次の例では、「first_name」という既存のクッキーが削除されます.次にReadCookiesのサーブレットを実行するとfirst_が返されます.nameは空の値です.
//       java  
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
 
//    HttpServlet  
public class DeleteCookies extends HttpServlet {
 
  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
            throws ServletException, IOException
  {
      Cookie cookie = null;
	  Cookie[] cookies = null;
      //          Cookies    
      cookies = request.getCookies();
      
	  //         
      response.setContentType("text/html;charset=UTF-8");
 
      PrintWriter out = response.getWriter();
      String title = "Delete Cookies Example";
      String docType =
      "<!doctype html public \"-//w3c//dtd html 4.0 " +
      "transitional//en\">
"
; out.println(docType + "<html>
"
+ "<head><title>" + title + "</title></head>
"
+ "<body bgcolor=\"#f0f0f0\">
"
); if( cookies != null ){ out.println("<h2>Cookies </h2>"); for (int i = 0; i < cookies.length; i++){ cookie = cookies[i]; if((cookie.getName( )).compareTo("first_name") == 0 ){ cookie.setMaxAge(0); response.addCookie(cookie); out.print(" cookie:" + cookie.getName( ) + "<br/>"); } out.print(" :" + cookie.getName( ) + ","); out.print(" :" + cookie.getValue( )+" <br/>"); } }else{ out.println( "<h2 class="tutheader">No cookies founds</h2>"); } out.println("</body>"); out.println("</html>"); } }

上のサーブレットDeleteCookiesをコンパイルし、web.xmlファイルに適切なエントリを作成します.現在実行中http://localhost:8080/DeleteCookiesを選択すると、次の結果が表示されます.
Cookies名と値が削除されたcookie:first_name名:first_name,値:John名:last_name,値:Player
今から実行してみますhttp://localhost:8080/ReadCookies次のように、クッキーが1つしか表示されません.
Cookies名と値名の検索:last_name,値:Player
Cookiesは、Internet Explorerから手動で削除できます.[ツール](Tools)メニューで、[インターネットオプション](Internet Options)を選択します.すべてのCookiesを削除する場合は、「Cookiesを削除」を押します.