サーブレット-Cookieの処理

クッキーはクライアントコンピュータに保存されるテキストファイルであり、さまざまな情報追跡の目的で保持されます。JavaサーブレットはHTTPCookieを透過的にサポートします。

リピーターの特定には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 = tutorialspoint.com
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

サーブレットは、Cookieオブジェクトの配列を返すrequestメソッドrequest.getCookies()を介してCookieにアクセスできます。

サーブレットCookieメソッド

以下は、サーブレットでCookieを操作するときに使用できる便利なメソッドのリストです。

シニア番号 方法と説明
1

public void setDomain(String pattern)

このメソッドは、cookieが適用されるドメインを設定します(例:tutorialspoint.com)。

2

public String getDomain()

このメソッドは、cookieが適用されるドメイン(tutorialspoint.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) Creating a Cookie object −どちらも文字列であるCookie名とCookie値を使用してCookieコンストラクターを呼び出します。

Cookie cookie = new Cookie("key","value");

名前にも値にも空白や次の文字を含めることはできません。

[ ] ( ) = , " / ? @ : ;

(2) Setting the maximum age− setMaxAgeを使用して、Cookieが有効である期間(秒単位)を指定します。以下は、24時間Cookieを設定します。

cookie.setMaxAge(60 * 60 * 24);

(3) Sending the Cookie into the HTTP response headers −次のようにresponse.addCookieを使用してHTTP応答ヘッダーにCookieを追加します−

response.addCookie(cookie);

フォームの例を変更して、姓名の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.htmに保持し、<Tomcat-installationdirectory> / webapps / ROOTディレクトリに配置します。http:// localhost:8080 / Hello.htmにアクセスする場合、上記のフォームの実際の出力は次のとおりです。

名と姓を入力して、送信ボタンをクリックしてください。これにより、画面に名と姓が表示されると同時に、2つのCookieのfirstNameとlastNameが設定され、次に[送信]ボタンを押したときにサーバーに返されます。

次のセクションでは、WebアプリケーションでこれらのCookieにアクセスする方法について説明します。

サーブレットを使用したCookieの読み取り

Cookieを読み取るには、を呼び出してjavax.servlet.http.Cookieオブジェクトの配列を作成する必要があります。getCookies()HttpServletRequestのメソッド。次に、配列を循環し、getName()メソッドとgetValue()メソッドを使用して、各Cookieと関連する値にアクセスします。

前の例で設定した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>");
   }
}

上記のサーブレットをコンパイルする ReadCookiesweb.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を削除する

クッキーを削除するのはとても簡単です。クッキーを削除したい場合は、次の3つの手順に従ってフォローアップする必要があります-

  • 既存のCookieを読み取り、Cookieオブジェクトに保存します。

  • を使用してCookieの経過時間をゼロに設定します setMaxAge() 既存の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>");
   }
}

上記のサーブレットをコンパイルする DeleteCookiesweb.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

InternetExplorerでCookieを手動で削除できます。[ツール]メニューから開始し、[インターネットオプション]を選択します。すべてのCookieを削除するには、[Cookieの削除]を押します。