English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Cookieはクライアント側のコンピュータに保存されているテキストファイルであり、さまざまなトレーキング情報を保持しています。Java ServletはHTTP Cookieを明らかにサポートしています。
ユーザーを識別するためにCookieを使用する方法は、以下の3つのステップで構成されています:
サーバースクリプトはブラウザにCookieのセットを送信します。例えば、名前、年齢、または識別番号などです。
ブラウザはこれらの情報をローカルコンピュータに保存し、将来の使用のために利用します。
次にブラウザがWebサーバーに任意のリクエストを送信した場合、ブラウザはこれらのCookie情報をサーバーに送信し、サーバーはこれらの情報を使用してユーザーを識別します。
この章では、Cookieを設定またはリセットする方法、それらにアクセスする方法、およびそれらを削除する方法について説明します。
Servlet Cookie処理では、中国語をエンコードおよびデコードする必要があります。方法は以下の通りです:
String str = java.net.URLEncoder.encode("中文","UTF"-8"); //エンコード String str = java.net.URLDecoder.decode("エンコードされた文字列","UTF-8"); // デコード
Cookieは通常HTTPヘッダー情報に設定されます(JavaScriptでもブラウザ上で直接Cookieを設定できます)。Cookieを設定するServletは以下のようなヘッダー情報を送信します:
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=oldtoolbag.com Connection: close Content-Type: text/html
ご覧の通り、Set-Cookieヘッダーには、名前と値のペア、GMT日付、パス、ドメインが含まれています。名前と値はURLエンコードされます。expiresフィールドは、ブラウザに指定された時間と日付以降にこの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
Servletはリクエストメソッドを通じて request.getCookies() Cookieにアクセスします。このメソッドは、以下を返します Cookie オブジェクトの配列。
以下はServletでCookieを操作する際に使用できる便利なメソッドリストです。
番号 | 方法 & 説明 |
---|---|
1 | public void setDomain(String pattern) このメソッドは、cookie が適用されるドメインを設定します。例えば、oldtoolbag.com。 |
2 | public String getDomain() このメソッドは、cookie が適用されるドメインを取得します。例えば、oldtoolbag.com。 |
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 purpose) cookie のコメントを設定します。このコメントは、ブラウザがユーザーに cookie を表示する際に非常に有用です。 |
12 | public String getComment() cookie のコメントを取得します。cookie にコメントがない場合は null を返します。 |
Servlet を通じて 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) CookieをHTTP応答ヘッダーに送信します:以下のように、CookieをHTTP応答ヘッダーに送信するために使用できます: response.addCookie を変更して、HTTP応答ヘッダーにCookieを追加します:
response.addCookie(cookie);
私たちの フォームデータ例、名前と姓の Cookieを設定します。
package com.w3codebox.test; import java.io.IOException; import java.io.PrintWriter; import java.net.URLEncoder; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet 実装クラス HelloServlet */ @WebServlet("/HelloForm) public class HelloForm extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public HelloForm() { super(); // TODO Auto-生成されたコンストラクタスタブ } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 名前と姓の Cookieを作成します Cookie name = new Cookie("name", URLEncoder.encode(request.getParameter("name"), "UTF-8");-8")); // 中国語変換 Cookie url = new Cookie("url", request.getParameter("url")); // 2つの Cookieの有効期限を設定します 24 時間後 name.setMaxAge(60*60*24); url.setMaxAge(60*60*24); // 応答ヘッダーに2つの Cookieを追加します response.addCookie( name ); response.addCookie( url ); // レスポンス内容タイプを設定 response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); String title = "設定 Cookie 例"; String docType = "<!DOCTYPE html>\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("name") + "\n</li>"}} + " <li><b>サイト URL:</b>:" + request.getParameter("url") + "\n</li>"}} + "</ul>\n" + "</body></html>"); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-生成されたメソッドスケルトン doGet(request, response); } }
上記の Servlet をコンパイルします HelloForm、web.xml ファイルに適切なエントリを作成します:
<?xml version="1.0" encoding="UTF-8"?> <web-app> <servlet> <!-- クラス名 --> <servlet-name>HelloForm</servlet-name> <!-- のパッケージ --> <servlet-class>com.w3codebox.test.HelloForm</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloForm</servlet-name> <!-- 訪問するウェブサイト --> <url-pattern>/TomcatTest/HelloForm</url-pattern> </servlet-mapping> </web-app>
最後に以下の HTML ページを試して Servlet を呼び出します。
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>基礎教程網(w3(codebox.com)</title> </head> <body> <form action="/TomcatTest/HelloForm" method="GET"> サイト名:<input type="text" name="name"> <br /> サイト URL:<input type="text" name="url" /><br> <input type="submit" value="提交" /> </form> </body> </html>
上記の HTML 内容をファイルに保存します /TomcatTest/test.html 内にアクセスします。
次に、http://localhost:8080/TomcatTest/test.html、以下のように表示されます:
「提交」ポイントをクリックした後、以下のようになります:
注意:上記の一部のパスは、プロジェクトの実際のパスに応じて修正する必要があります。
Cookie を読み取るために、呼び出す必要があります HttpServletRequest の getCookies( ) メソッドは javax.servlet.http.Cookie オブジェクトの配列です。それから配列をループして、getName() と getValue() メソッドを使って各 cookie と関連する値にアクセスします。
上記の例で設定された Cookie を読み取ろう
package com.w3codebox.test; import java.io.IOException; import java.io.PrintWriter; import java.net.URLDecoder; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet 実装クラス ReadCookies */ @WebServlet("/ReadCookies) public class ReadCookies extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public ReadCookies() { super(); // TODO Auto-生成されたコンストラクタスタブ } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Cookie cookie = null; Cookie[] cookies = null; // このドメインに関連するCookieの配列を取得 cookies = request.getCookies(); // レスポンス内容タイプを設定 response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); String title = "Delete Cookie Example"; String docType = "<!DOCTYPE html>\n"; out.println(docType + "<html>\n" + "<head><title>" + title + "</title></head>\n" + "<body bgcolor=\"#f0f0f0\">\n" ); if( cookies != null ){ out.println("<h2>Cookie 名前と値</h2>"); for (int i = 0; i < cookies.length; i++{ cookie = cookies[i]; if((cookie.getName()).compareTo("name") == 0) { cookie.setMaxAge(0); response.addCookie(cookie); out.print("削除されたcookie:" + cookie.getName( ) + "<br}}/>"); } out.print("パラメータ名:" + cookie.getName( ) + ","); out.print("パラメータ値:" + URLDecoder.decode(cookie.getValue(), "utf-8) +" <br/>"); } }else{ out.println( "<h2 class=\"tutheader\">No Cookie founds</h2>"); } out.println("</body>"); out.println("</html>"); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-生成されたメソッドスケルトン doGet(request, response); } }
上記の Servlet をコンパイルします ReadCookiesをweb.xmlファイルに適切なエントリを作成し、実行を試みます。 http://localhost:8080/TomcatTest/ReadCookies、以下の結果が表示されます:
Cookieの削除は非常に簡単です。cookieを削除したい場合は、以下の3つのステップに従ってください:
現在のcookieを読み取り、Cookieオブジェクトに保存します。
使用 setMaxAge() cookieの有効期限を0に設定して、現在のcookieを削除します。
このcookieをレスポンスヘッダーに追加します。
以下の例では、次回 ReadCookies Servletを実行したときにurlがnullになるように、現在の「url」名のcookieを削除します。
package com.w3codebox.test; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class DeleteCookies */ @WebServlet("/DeleteCookies) public class DeleteCookies extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public DeleteCookies() { super(); // TODO Auto-生成されたコンストラクタスタブ } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Cookie cookie = null; Cookie[] cookies = null; // このドメインに関連するCookieの配列を取得 cookies = request.getCookies(); // レスポンス内容タイプを設定 response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); String title = "Cookie削除サンプル"; String docType = "<!DOCTYPE html>\n"; out.println(docType + "<html>\n" + "<head><title>" + title + "</title></head>\n" + "<body bgcolor=\"#f0f0f0\">\n" ); if( cookies != null ){ out.println("<h2>Cookie 名前と値</h2>"); for (int i = 0; i < cookies.length; i++{ cookie = cookies[i]; if((cookie.getName( )).compareTo("url") == 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 Cookie founds</h2>"); } out.println("</body>"); out.println("</html>"); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-生成されたメソッドスケルトン doGet(request, response); } }
上記の Servlet をコンパイルします DeleteCookies、web.xml ファイルに適切なエントリを作成します。次に実行します http://localhost:8080/TomcatTest/DeleteCookies、以下の結果が表示されます: