原文: https://beginnersbook.com/2013/05/servlet-cookies/

在上一篇指南中,我介绍了 Servlet 中的会话。在这里,我们将讨论用于会话管理的Cookie。让我们回顾一下上一篇教程中的一些内容,以便我们可以关联会话和cookie。当用户第一次访问 Web 应用时,servlet 容器通过调用request.getSession()来创建新的HttpSession对象。为会话分配唯一的 ID。Servlet 容器还在 HTTP 响应的标头中设置Cookie,其中包含cookie名称和唯一会话 ID 作为其值。

cookie存储在用户浏览器中,客户端(用户的浏览器)将此cookie发送回服务器以获取所有后续请求,直到cookie有效。Servlet 容器检查cookie的请求标头,并从cookie获取会话信息,并使用服务器内存中的关联会话。

会话在web.xml中的标签中指定的时间内保持活动状态。如果未在web.xml中设置标记,则会话将保持活动状态 30 分钟。 只要用户的浏览器正在运行Cookie就会保持活动状态,一旦浏览器关闭,cookie和相关的会话信息就会被破坏。因此,当用户再次打开浏览器并向 Web 服务器发送请求时,将创建新会话。

Cookie的类型

我们可以根据Cookie的到期时间对Cookie进行分类:

  1. 会话
  2. 持久

1)会话Cookie

会话Cookie没有到期时间。它存在于浏览器内存中。一旦 Web 浏览器关闭,该cookie就会被破坏。

2)持久性Cookie

与会话Cookie不同,它们具有到期时间,它们存储在用户硬盘中,并根据到期时间被销毁。

如何将Cookie发送给客户

以下是向客户端发送cookie的步骤:

  1. 创建一个Cookie对象。
  2. 设置最大年龄。
  3. Cookie放在 HTTP 响应标头中。

1)创建一个Cookie对象:

  1. Cookie c = new Cookie("userName","Chaitanya");

2)设置最大年龄:

通过使用setMaxAge()方法,我们可以设置特定cookie的最大年龄(以秒为单位)。

  1. c.setMaxAge(1800);

3)将Cookie放在 HTTP 响应头中:

我们可以通过response.addCookie()方法将cookie发送到客户端浏览器。

  1. response.addCookie(c);

如何阅读cookie

  1. Cookie c[]=request.getCookies();
  2. //c.length gives the cookie count
  3. for(int i=0;i<c.length;i++){
  4. out.print("Name: "+c[i].getName()+" & Value: "+c[i].getValue());
  5. }

java servlet 中的Cookie示例

index.html

  1. <form action="login">
  2. User Name:<input type="text" name="userName"/><br/>
  3. Password:<input type="password" name="userPassword"/><br/>
  4. <input type="submit" value="submit"/>
  5. </form>

MyServlet1.java

  1. import java.io.*;
  2. import javax.servlet.*;
  3. import javax.servlet.http.*;
  4. public class MyServlet1 extends HttpServlet
  5. {
  6. public void doGet(HttpServletRequest request,
  7. HttpServletResponse response) {
  8. try{
  9. response.setContentType("text/html");
  10. PrintWriter pwriter = response.getWriter();
  11. String name = request.getParameter("userName");
  12. String password = request.getParameter("userPassword");
  13. pwriter.print("Hello "+name);
  14. pwriter.print("Your Password is: "+password);
  15. //Creating two cookies
  16. Cookie c1=new Cookie("userName",name);
  17. Cookie c2=new Cookie("userPassword",password);
  18. //Adding the cookies to response header
  19. response.addCookie(c1);
  20. response.addCookie(c2);
  21. pwriter.print("<br><a href='welcome'>View Details</a>");
  22. pwriter.close();
  23. }catch(Exception exp){
  24. System.out.println(exp);
  25. }
  26. }
  27. }

MyServlet2.java

  1. import java.io.*;
  2. import javax.servlet.*;
  3. import javax.servlet.http.*;
  4. public class MyServlet2 extends HttpServlet {
  5. public void doGet(HttpServletRequest request,
  6. HttpServletResponse response){
  7. try{
  8. response.setContentType("text/html");
  9. PrintWriter pwriter = response.getWriter();
  10. //Reading cookies
  11. Cookie c[]=request.getCookies();
  12. //Displaying User name value from cookie
  13. pwriter.print("Name: "+c[1].getValue());
  14. //Displaying user password value from cookie
  15. pwriter.print("Password: "+c[2].getValue());
  16. pwriter.close();
  17. }catch(Exception exp){
  18. System.out.println(exp);
  19. }
  20. }
  21. }

web.xml

  1. <web-app>
  2. <display-name>BeginnersBookDemo</display-name>
  3. <welcome-file-list>
  4. <welcome-file>index.html</welcome-file>
  5. </welcome-file-list>
  6. <servlet>
  7. <servlet-name>Servlet1</servlet-name>
  8. <servlet-class>MyServlet1</servlet-class>
  9. </servlet>
  10. <servlet-mapping>
  11. <servlet-name>Servlet1</servlet-name>
  12. <url-pattern>/login</url-pattern>
  13. </servlet-mapping>
  14. <servlet>
  15. <servlet-name>Servlet2</servlet-name>
  16. <servlet-class>MyServlet2</servlet-class>
  17. </servlet>
  18. <servlet-mapping>
  19. <servlet-name>Servlet2</servlet-name>
  20. <url-pattern>/welcome</url-pattern>
  21. </servlet-mapping>
  22. </web-app>

输出:

欢迎画面:

Servlet 中的`Cookie` - 图1

点击提交后:

Servlet 中的`Cookie` - 图2

点击查看详情后:

Servlet 中的`Cookie` - 图3

Cookie类的方法

public void setComment(String purpose):此方法用于在cookie中设置注释。这主要用于描述cookie的用途。

public String getComment():返回描述此cookie用途的注释,如果cookie没有注释,则返回null

public void setMaxAge(int expiry):以秒为单位设置cookie的最大年龄。

public int getMaxAge():获取此Cookie的最大年龄(以秒为单位)。默认情况下,返回 -1,表示cookie将持续到浏览器关闭。

public String getName():返回cookie的名称。创建后无法更改名称。

public void setValue(String newValue):为此Cookie指定一个新值。

public String getValue():获取此Cookie的当前值。

上面的列表只有常用的方法。要获得Cookie类的完整方法列表,请参阅官方文档