Servlets-cookies-handling
サーブレット-Cookieの処理
Cookieは、クライアントコンピューターに保存されるテキストファイルであり、さまざまな情報追跡目的で保持されます。 Javaサーブレットは、HTTP Cookieを透過的にサポートします。
戻ってくるユーザーを識別するには、3つのステップがあります-
- サーバースクリプトは、一連のCookieをブラウザーに送信します。 たとえば、名前、年齢、識別番号など。
- ブラウザは、将来使用するためにこの情報をローカルマシンに保存します。 *ブラウザーが次にWebサーバーに要求を送信すると、ブラウザーはそれらのCookie情報をサーバーに送信し、サーバーはその情報を使用してユーザーを識別します。
この章では、Cookieを設定またはリセットする方法、Cookieにアクセスする方法、Cookieを削除する方法について説明します。
クッキーの構造
Cookieは通常、HTTPヘッダーに設定されます(JavaScriptはブラウザーで直接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 = finddevguides.com
Connection: close
Content-Type: text/html
ご覧のとおり、Set-Cookieヘッダーには、名前と値のペア、GMT日付、パス、およびドメインが含まれています。 名前と値はURLエンコードされます。 期限切れフィールドは、指定された日時の後にクッキーを「忘れる」ようにブラウザに指示するものです。
ブラウザがクッキーを保存するように設定されている場合、有効期限までこの情報を保持します。 ユーザーがブラウザで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
サーブレットは、_Cookie_オブジェクトの配列を返すリクエストメソッド_request.getCookies()_を介してCookieにアクセスできます。
サーブレットCookieメソッド
以下は、サーブレットでCookieを操作するときに使用できる便利なメソッドのリストです。
Sr.No. | Method & Description |
---|---|
1 |
public void setDomain(String pattern) このメソッドは、cookieが適用されるドメインを設定します(例:finddevguides.com)。 |
2 |
public String getDomain() このメソッドは、cookieが適用されるドメイン(たとえば、finddevguides.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を返します。 |
サーブレットでのCookieの設定
サーブレットでCookieを設定するには、3つのステップが必要です-
(1)Cookieオブジェクトの作成-Cookieコンストラクターを、両方とも文字列であるCookie名とCookie値で呼び出します。
Cookie cookie = new Cookie("key","value");
覚えておいて、名前も値も空白または次の文字のいずれかを含むべきではありません-
[ ] ( ) = , "/? @ : ;
(2)最大経過時間の設定-setMaxAgeを使用して、Cookieの有効期間(秒単位)を指定します。 以下は24時間Cookieをセットアップします。
cookie.setMaxAge(60 *60* 24);
(3)CookieをHTTP応答ヘッダーに送信-response.addCookieを使用して、HTTP応答ヘッダーに次のようにCookieを追加します-
response.addCookie(cookie);
例
link:/servlets/servlets-form-data [フォームの例]を変更して、姓と名のCookieを設定します。
//Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
//Extend HttpServlet class
public class HelloForm extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//Create cookies for first and last names.
Cookie firstName = new Cookie("first_name", request.getParameter("first_name"));
Cookie lastName = new Cookie("last_name", request.getParameter("last_name"));
//Set expiry date after 24 Hrs for both the cookies.
firstName.setMaxAge(60*60*24);
lastName.setMaxAge(60*60*24);
//Add both the cookies in the response header.
response.addCookie( firstName );
response.addCookie( lastName );
//Set response content type
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String title = "Setting 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" +
"<h1 align = \"center\">" + title + "</h1>\n" +
"<ul>\n" +
" <li><b>First Name</b>: "
+ request.getParameter("first_name") + "\n" +
" <li><b>Last Name</b>: "
+ request.getParameter("last_name") + "\n" +
"</ul>\n" +
"</body>
</html>"
);
}
}
上記のサーブレット HelloForm をコンパイルし、web.xmlファイルに適切なエントリを作成し、最後にHTMLページに従ってサーブレットを呼び出します。
<html>
<body>
<form action = "HelloForm" method = "GET">
First Name: <input type = "text" name = "first_name">
<br/>
Last Name: <input type = "text" name = "last_name"/>
<input type = "submit" value = "Submit"/>
</form>
</body>
</html>
上記のHTMLコンテンツをファイルHelloに保存し、<Tomcat-installationdirectory>/webapps/ROOTディレクトリに配置します。 _http://localhost:8080/Hello_にアクセスすると、上記のフォームの実際の出力は次のようになります。
名前苗字:
名と姓を入力して、送信ボタンをクリックしてください。 これにより、画面に名と姓が表示されると同時に、次回[送信]ボタンを押したときにサーバーに返される2つのcookie firstNameとlastNameが設定されます。
次のセクションでは、WebアプリケーションでこれらのCookieにアクセスする方法について説明します。
サーブレットを使用したCookieの読み取り
Cookieを読み取るには、_HttpServletRequest_の* getCookies()*メソッドを呼び出して、_javax.servlet.http.Cookie_オブジェクトの配列を作成する必要があります。 次に、配列を循環し、getName()およびgetValue()メソッドを使用して、各Cookieおよび関連する値にアクセスします。
例
前の例で設定したクッキーを読んでみましょう-
//Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
//Extend HttpServlet class
public class ReadCookies extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Cookie cookie = null;
Cookie[] cookies = null;
//Get an array of Cookies associated with this domain
cookies = request.getCookies();
//Set response content type
response.setContentType("text/html");
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> Found Cookies Name and Value</h2>");
for (int i = 0; i < cookies.length; i++) {
cookie = cookies[i];
out.print("Name : " + cookie.getName( ) + ", ");
out.print("Value: " + cookie.getValue( ) + " <br/>");
}
} else {
out.println("<h2>No cookies founds</h2>");
}
out.println("</body>");
out.println("</html>");
}
}
上記のサーブレット ReadCookies をコンパイルし、web.xmlファイルに適切なエントリを作成します。 あなたがfirst_name cookieを "John"に、last_name cookieを "Player"に設定した場合、_http://localhost:8080/ReadCookies_を実行すると次の結果が表示されます-
Found Cookies Name and Value
Name : first_name, Value: John
Name : last_name, Value: Player
サーブレットでCookieを削除する
Cookieを削除するのは非常に簡単です。 あなたはクッキーを削除したい場合は、単に次の3つのステップをフォローアップする必要があります-
- 既存のCookieを読み取り、Cookieオブジェクトに保存します。
- * setMaxAge()*メソッドを使用して既存のCookieを削除し、Cookieの有効期間をゼロに設定します
- このCookieを応答ヘッダーに追加し直します。
例
次の例では、「first_name」という名前の既存のCookieを削除し、次にReadCookiesサーブレットを実行すると、first_nameに対してnull値が返されます。
//Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
//Extend HttpServlet class
public class DeleteCookies extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Cookie cookie = null;
Cookie[] cookies = null;
//Get an array of Cookies associated with this domain
cookies = request.getCookies();
//Set response content type
response.setContentType("text/html");
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 Name and Value</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("Deleted cookie : " + cookie.getName( ) + "<br/>");
}
out.print("Name : " + cookie.getName( ) + ", ");
out.print("Value: " + cookie.getValue( )+" <br/>");
}
} else {
out.println("<h2>No cookies founds</h2>");
}
out.println("</body>");
out.println("</html>");
}
}
上記のサーブレット DeleteCookies をコンパイルし、web.xmlファイルに適切なエントリを作成します。 今_http://localhost:8080/DeleteCookies_を実行すると、次の結果が表示されます-
Cookies Name and Value
Deleted cookie : first_name
Name : first_name, Value: John
Name : last_name, Value: Player
_http://localhost:8080/ReadCookies_を実行してみると、次のように1つのCookieのみが表示されます-
Found Cookies Name and Value
Name : last_name, Value: Player
Internet ExplorerでCookieを手動で削除できます。 [ツール]メニューから開始し、[インターネットオプション]を選択します。 すべてのCookieを削除するには、[Cookieの削除]を押します。