Pengendalian Kuki Servlet


Kuki ialah fail teks yang disimpan pada komputer pelanggan dan menyimpan pelbagai maklumat penjejakan. Java Servlets nampaknya menyokong Kuki HTTP.

Mengenal pasti pengguna kembali melibatkan tiga langkah:

  • Skrip pelayan menghantar satu set Kuki ke penyemak imbas. Contohnya: nama, umur atau nombor pengenalan, dsb.

  • Pelayar menyimpan maklumat ini secara setempat pada komputer anda untuk kegunaan masa hadapan.

  • Apabila penyemak imbas seterusnya menghantar sebarang permintaan kepada pelayan web, penyemak imbas akan menghantar maklumat Kuki ini kepada pelayan dan pelayan akan menggunakan maklumat ini untuk mengenal pasti pengguna.

Bab ini akan mengajar anda cara menetapkan atau menetapkan semula Kuki, cara mengaksesnya dan cara memadamkannya.

Anatomi Kuki

Kuki biasanya ditetapkan dalam pengepala HTTP (walaupun JavaScript juga boleh menetapkan kuki terus pada penyemak imbas). Servlet yang menetapkan kuki akan menghantar maklumat pengepala berikut:

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

Seperti yang anda lihat, pengepala Set-Cookie mengandungi pasangan nilai nama, tarikh GMT, laluan dan domain. Nama dan nilai akan dikodkan URL. Medan tamat tempoh ialah arahan yang memberitahu pelayar untuk "melupakan" kuki selepas masa dan tarikh tertentu.

Jika penyemak imbas anda dikonfigurasikan untuk menyimpan kuki, ia akan mengekalkan maklumat ini sehingga tarikh tamat tempoh. Jika penyemak imbas pengguna menghala ke mana-mana halaman yang sepadan dengan laluan dan domain kuki, ia akan menghantar semula kuki ke pelayan. Maklumat pengepala penyemak imbas mungkin kelihatan seperti berikut:

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 boleh mengakses Cookie melalui kaedah permintaan request.getCookies(), yang akan mengembalikan Cookie susunan objek.

Kaedah Kuki Servlet

Berikut ialah senarai kaedah berguna yang boleh digunakan semasa memanipulasi Kuki dalam Servlet.

序号方法 & 描述
1public void setDomain(String pattern)
该方法设置 cookie 适用的域,例如 w3cschool.cc。
2public String getDomain()
该方法获取 cookie 适用的域,例如 w3cschool.cc。
3public void setMaxAge(int expiry)
该方法设置 cookie 过期的时间(以秒为单位)。如果不这样设置,cookie 只会在当前 session 会话中持续有效。
4public int getMaxAge()
该方法返回 cookie 的最大生存周期(以秒为单位),默认情况下,-1 表示 cookie 将持续下去,直到浏览器关闭。
5public String getName()
该方法返回 cookie 的名称。名称在创建后不能改变。
6public void setValue(String newValue)
该方法设置与 cookie 关联的值。
7public String getValue()
该方法获取与 cookie 关联的值。
8public void setPath(String uri)
该方法设置 cookie 适用的路径。如果您不指定路径,与当前页面相同目录下的(包括子目录下的)所有 URL 都会返回 cookie。
9public String getPath()
该方法获取 cookie 适用的路径。
10public void setSecure(boolean flag)
该方法设置布尔值,表示 cookie 是否应该只在加密的(即 SSL)连接上发送。
11public void setComment(String purpose)
该方法规定了描述 cookie 目的的注释。该注释在浏览器向用户呈现 cookie 时非常有用。
12public String getComment()
该方法返回了描述 cookie 目的的注释,如果 cookie 没有注释则返回 null。

Tetapkan Kuki melalui Servlet

Menetapkan Kuki melalui Servlet merangkumi tiga langkah:

(1) Buat objek Kuki: Anda boleh menghubungi dengan pembina Kuki dengan nama kuki dan nilai kuki, kedua-dua nama kuki dan nilai kuki ialah rentetan.

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

Sila ingat bahawa nama mahupun nilai tidak boleh mengandungi ruang atau mana-mana aksara berikut:

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

(2) Tetapkan seumur hidup maksimum: Anda boleh Gunakan setMaxAge kaedah untuk menentukan berapa lama (dalam saat) kuki kekal sah. Berikut akan menetapkan kuki dengan tempoh sah maksimum 24 jam.

cookie.setMaxAge(60*60*24);

(3) Hantar Kuki ke pengepala respons HTTP: Anda boleh menggunakan response.addCookie untuk menambah Kuki dalam pengepala respons HTTP, seperti ditunjukkan di bawah:

response.addCookie(cookie);

Contoh

Mari kita ubah suai contoh data borang kami untuk menetapkan kuki bagi nama pertama dan nama keluarga.

// 导入必需的 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>");
  }
}

Kompilasi Servlet HelloForm di atas dan buat entri yang sesuai dalam fail web.xml dan akhirnya cuba halaman HTML berikut untuk memanggil Servlet.

 <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>

Simpan kandungan HTML di atas ke dalam fail hello.htm dan letakkan dalam direktori <Tomcat-installation-directory>/webapps/ROOT. Apabila anda melawati http://localhost:8080/Hello.htm, output sebenar borang di atas kelihatan seperti ini:

Cuba masukkan nama pertama dan nama keluarga , kemudian Klik butang "Serah", nama pertama dan nama keluarga akan dipaparkan pada skrin, dan dua Nama pertama dan Nama akhir Kuki akan ditetapkan Apabila anda menekan butang Hantar kali seterusnya, kedua-dua Kuki ini akan dihantar semula ke pelayan.

Bahagian seterusnya menerangkan cara mengakses kuki ini dalam aplikasi web.

Membaca Cookies melalui Servlet

Untuk membaca Cookies, anda perlu mencipta javax dengan memanggil kaedah getCookies( ) HttpServletRequest Tatasusunan objek .servlet.http.Cookie. Kemudian ia menggelung melalui tatasusunan dan mengakses setiap kuki dan nilai yang berkaitan menggunakan kaedah getName() dan getValue().

Instance

Mari kami membaca set Cookies dalam contoh di atas

// 导入必需的 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>");
   }
}

Kompilasi Servlet di atas ReadCookies dan dalam fail web.xml Cipta yang sesuai entri. Jika anda telah menetapkan kuki first_name kepada "John" dan kuki nama akhir kepada "Player" dan cuba jalankan http://localhost:8080/ReadCookies, keputusan berikut akan dipaparkan:

< table class=" src" style="background-color: #f7f7f7;border: 1px solid #d6d6d6;border-collapse: collapse;width: 100%;">

查找 Cookies 名称和值

名称:first_name,值:John
名称:last_name,值:Player
Cari nama dan nilai Kuki <🎜>Nama: first_name, nilai: John <🎜>Name: last_name, value: Player

Memadam Kuki melalui Servlet

Memadam Kuki adalah sangat mudah. Jika anda ingin memadamkan kuki, maka anda hanya perlu mengikuti tiga langkah ini:

  • Baca kuki sedia ada dan simpannya dalam objek Kuki.

  • Gunakan kaedah setMaxAge() untuk menetapkan umur kuki kepada sifar untuk memadam kuki sedia ada.

  • Tambahkan kuki ini pada pengepala respons.

Contoh

Contoh berikut akan memadamkan kuki sedia ada bernama "first_name", dan apabila anda menjalankan ReadCookies Servlet kali seterusnya, ia akan mengembalikan first_name sebagai nilai 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>");
   }
}

Kompilasikan Servlet DeleteCookies di atas dan buat entri yang sesuai dalam fail web.xml. Sekarang jalankan http://localhost:8080/DeleteCookies dan keputusan berikut akan dipaparkan:

Cookies 名称和值

已删除的 cookie:first_name
名称:first_name,值:John
名称:last_name,值:Player
Nama dan Nilai Kuki

Cookies dipadamkan: first_nameNama: first_name, Nilai: JohnNama: last_name, Value: Player

Sekarang cuba jalankan

查找 Cookies 名称和值

名称:last_name,值:Player
http://localhost:8080/ReadCookies

, ia hanya akan memaparkan kuki seperti ini:

Cari nama dan nilai Cookies<🎜>Nama: last_name, value: Player
<🎜 >Anda boleh memadam kuki secara manual dalam Internet Explorer. Pada menu "Alat", pilih "Pilihan Internet". Jika anda ingin memadam semua kuki, klik "Padam Kuki". <🎜><🎜>