サーブレット Cookie の処理
Cookie はクライアントのコンピュータに保存され、さまざまな追跡情報を保持するテキスト ファイルです。 Java サーブレットは HTTP Cookie をサポートしているようです。
再訪ユーザーの識別には 3 つの手順が必要です:
サーバー スクリプトは Cookie のセットをブラウザに送信します。例: 名前、年齢、識別番号など。
ブラウザは、将来の使用に備えてこの情報をコンピュータ上にローカルに保存します。
次回ブラウザが Web サーバーにリクエストを送信するときに、ブラウザはこれらの Cookie 情報をサーバーに送信し、サーバーはこの情報を使用してユーザーを識別します。
この章では、Cookie の設定またはリセット方法、Cookie へのアクセス方法、削除方法について説明します。
Cookie の構造
Cookie は通常、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 エンコードされます。有効期限フィールドは、指定された日時に Cookie を「忘れる」ようにブラウザに指示するものです。
ブラウザが Cookie を保存するように設定されている場合、この情報は有効期限まで保持されます。ユーザーのブラウザが 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 オブジェクトの配列を返します。
サーブレット Cookie メソッド
以下は、サーブレットで Cookie を操作するときに使用できる便利なメソッドのリストです。
シリアル番号 | メソッドと説明 |
---|---|
1 | public void setDomain(String pattern) このメソッドは、w3cschool.cc など、Cookie が適用されるドメインを設定します。 |
2 | public String getDomain() このメソッドは、Cookie が適用されるドメイン (w3cschool.cc など) を取得します。 |
3 | public void setMaxAge(int expiry) このメソッドは、Cookie の有効期限を (秒単位で) 設定します。このように設定しない場合、Cookie は現在のセッションの間のみ持続します。 |
4 | public int getMaxAge() このメソッドは、Cookie の最大有効期間 (秒単位) を返します。デフォルトでは、-1 はブラウザが閉じるまで Cookie が存続することを意味します。 |
5 | public String getName() このメソッドは、Cookie の名前を返します。作成後に名前を変更することはできません。 |
6 | public void setValue(String newValue) このメソッドは、Cookie に関連付けられた値を設定します。 |
7 | public String getValue() このメソッドは、Cookie に関連付けられた値を取得します。 |
8 | public void setPath(String uri) このメソッドは、Cookie に適用されるパスを設定します。パスを指定しない場合、現在のページと同じディレクトリにあるすべての URL (サブディレクトリを含む) が Cookie を返します。 |
9 | public String getPath() このメソッドは、Cookie に適用されるパスを取得します。 |
10 | public void setSecure(boolean flag) このメソッドは、Cookie が暗号化された (つまり SSL) 接続でのみ送信されるべきかどうかを示すブール値を設定します。 |
11 | public void setComment(String purposes) このメソッドは、Cookie の目的を説明するコメントを指定します。この注釈は、ブラウザがユーザーに Cookie を提示するときに役立ちます。 |
12 | public String getComment() このメソッドは、Cookie の目的を説明するコメントを返します。Cookie にコメントがない場合は null を返します。 |
サーブレットを介して Cookie を設定する
サーブレットを介して Cookie を設定するには、次の 3 つの手順が含まれます:
(1) Cookie オブジェクトを作成します: Cookie 名と Cookie 値を使用して Cookie コンストラクターを呼び出すことができます。Cookie 名と Cookie 値は両方とも文字列です。 。
Cookie cookie = new Cookie("key","value");
名前にも値にもスペースや次の文字を含めないでください:
[ ] ( ) = , " / ? @ : ;
(2) 最大有効期間を設定します: setMaxAge メソッドを使用して、Cookie が有効な期間を指定できます (秒)。以下は、最大有効期間が 24 時間の Cookie を設定します。
cookie.setMaxAge(60*60*24);
(3) HTTP 応答ヘッダーに Cookie を送信します: 以下に示すように、response.addCookie を使用して HTTP 応答ヘッダーに Cookie を追加できます:
response.addCookie(cookie);
例
フォーム データ インスタンスを変更して、Cookie を設定しましょう名と姓の場合。
// 导入必需的 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\">\n"; out.println(docType + "<html>\n" + "<head><title>" + title + "</title></head>\n" + "<body bgcolor=\"#f0f0f0\">\n" + "<h1 align=\"center\">" + title + "</h1>\n" + "<ul>\n" + " <li><b>名字</b>:" + request.getParameter("first_name") + "\n</li>" + " <li><b>姓氏</b>:" + request.getParameter("last_name") + "\n</li>" + "</ul>\n" + "</body></html>"); } }
上記のサーブレット HelloForm をコンパイルし、web.xml ファイルに適切なエントリを作成し、最後に次の HTML ページを試してサーブレットを呼び出します。
<html> <head> <meta charset="utf-8"> <title>php中文网(php.cn)</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 に保存し、<Tomcat-installation-directory>/webapps/ROOT ディレクトリに配置します。 http://localhost:8080/Hello.htm にアクセスすると、上記のフォームの実際の出力は次のようになります:
姓と名を入力して、[送信] ボタンをクリックしてください。名前と姓が表示されます。 画面上には、firstName と lastName の 2 つの Cookie が同時に設定され、次回送信ボタンを押すと、これら 2 つの Cookie がサーバーに送信されます。
次のセクションでは、Web アプリケーションでこれらの Cookie にアクセスする方法について説明します。
サーブレット経由の Cookie の読み取り
Cookie を読み取るには、HttpServletRequest の getCookies( ) メソッドを呼び出して、javax.servlet.http.Cookie オブジェクトの配列を作成する必要があります。次に、配列をループし、getName() メソッドと getValue() メソッドを使用して各 Cookie と関連する値にアクセスします。
例
上記のインスタンスに設定された Cookie を読み取ってみましょう
// 导入必需的 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\">\n"; out.println(docType + "<html>\n" + "<head><title>" + title + "</title></head>\n" + "<body bgcolor=\"#f0f0f0\">\n" ); 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 Cookie を「Player」に設定した場合、http://localhost:8080/ReadCookies を実行してみると、次の結果が表示されます:
Find Cookies名前と値名前: first_name、値: John名前: last_name、値: Player |
サーブレット経由で Cookie を削除する
Cookie を削除するのは非常に簡単です。 Cookie を削除したい場合は、次の 3 つの手順に従うだけです:
既存の Cookie を読み取り、それを Cookie オブジェクトに保存します。
setMaxAge()メソッドを使用してCookieの経過時間を0に設定し、既存のCookieを削除します。
この Cookie を応答ヘッダーに追加します。
例
次の例では、「first_name」という名前の既存の Cookie を削除し、次回 ReadCookies サーブレットを実行するときに、first_name を null 値として返します。
// 导入必需的 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\">\n"; out.println(docType + "<html>\n" + "<head><title>" + title + "</title></head>\n" + "<body bgcolor=\"#f0f0f0\">\n" ); 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 を実行すると、次の結果が表示されます:
Cookie の名前と値削除された Cookie: first_nameName: first_name、value: John Name: last_name、value :Player |
次に http://localhost:8080/ReadCookies を実行してみます。すると、次のような Cookie が 1 つだけ表示されます:
Cookie の名前と値を検索Name: last_name, value : Player |
Internet Explorer では Cookie を手動で削除できます。 「ツール」メニューで「インターネット オプション」を選択します。すべてのCookieを削除したい場合は、「Cookieを削除」をクリックしてください。