📜  Java中的 Javax.servlet.http.Cookie 类

📅  最后修改于: 2022-05-13 01:55:15.436000             🧑  作者: Mango

Java中的 Javax.servlet.http.Cookie 类

许多网站使用称为 cookie 的小文本字符串来存储连接之间的持久客户端状态。 Cookie 在请求和响应的 HTTP 标头中从服务器传递到客户端并再次返回。服务器可以使用 Cookie 来指示会话 ID、购物车内容、登录凭据、用户偏好等。

Cookie 是如何工作的?

cookie 是如何工作的?

从上图可以看出,当用户第一次请求页面时,服务器连同资源一起发送一个cookie对象存储在客户端机器上。此对象可能包含请求的详细信息。现在,如果用户再次请求相同的资源,它会随请求一起发送存储的 cookie,服务器可以使用该 cookie 来进一步增强用户的体验。

Cookie 的属性:

  • 名称 = 值对:这描述了存储在 cookie 中的实际信息。名称和值都不应包含空格或以下任何字符: [ ] ( ) = , ” / ? @ : ;
    有效 cookie 名称-值对的示例:
    Set-Cookie:session-id = 187-4969589-3049309
  • 域:默认情况下,cookie 应用于它来自的服务器。如果 cookie 最初是由 www.foo.example.com 设置的,则浏览器只会将 cookie 发送回 www.foo.example.com。但是,站点也可以指示 cookie 适用于整个子域,而不仅仅是原始服务器。例如,此请求为整个 foo.example.com 域设置了一个用户 cookie:
    浏览器不仅会将这个 cookie 回显到 www.foo.example.com,还会回显到 lothar.foo.example.com、eliza.foo.example.com、enoch.foo.example.com 和其他任何地方的主机在 foo.example.com 域中。但是,服务器只能为其直接所属的域设置 cookie。无论 www.foo.example.com 如何设置域,www.foo.example.com 都无法为 www.geeksforgeeks.org、example.com 或 .com 设置 cookie。
    Set-Cookie: user = geek ;Domain =.foo.example.com
  • 路径:当从同一服务器请求子树中的文档时,客户端会回显该 cookie。但是,它不使用站点上其他目录中的 cookie。
    Set-Cookie: user = geek; Path =/ restricted
  • Expires :在该日期过后,浏览器应从其缓存中删除 cookie。
    Set-Cookie: user = geek; expires = Wed, 21-Feb-2017 15:23:00 IST
  • Max-Age :此属性将 cookie 设置为在经过一定秒数后过期,而不是在特定时刻过期。例如,此 cookie 在首次设置后一小时(3,600 秒)过期。
    Set-Cookie: user = "geek"; Max-Age = 3600

构造函数:创建具有指定名称-值对的 cookie。

Syntax : public Cookie(String name, String value)
Parameters :
name : name of the cookie
value : value associated with this cookie

方法 :

  1. setDomain() :设置此 cookie 可见的域。域在前面cookie部分的属性中有详细说明。
    Syntax : public void setDomain(String pattern)
    Parameters :
    pattern : string representing the domain in which this cookie is visible.
  2. getDomain() :返回此 cookie 可见的域。
    Syntax : public String getDomain()
  3. setComment() :指定此 cookie 的用途。
    Syntax : public void setComment(String purpose)
    Parameters :
    purpose : string representing the purpose of this cookie.
  4. getComment() :返回表示此 cookie 用途的字符串。
    Syntax : public String getComment()
  5. setMaxAge() :指定此 cookie 过期之前经过的时间(以秒为单位)。
    Syntax : public void setMaxAge(long time)
    Parameters :
    time : time in seconds before this cookie expires
  6. getMaxAge() :返回此 cookie 的最大年龄组件。
    Syntax : public String getMaxAge()
  7. setPath() :指定客户端应返回 cookie 的 cookie 路径。
    Syntax : public void setPath(String path)
    Parameters :
    path : path where this cookie is returned
  8. getPath() :返回此 cookie 的路径组件。
    Syntax : public String getMaxAge()
  9. setSecure() :指示发送此 cookie 时是否使用安全协议。默认值为假。
    Syntax : public void setSecure(boolean secure)
    Parameters:
    secure - If true, the cookie can only be sent over a secure
    protocol like https. 
    If false, it can be sent over any protocol.
  10. getSecure() :如果这个 cookie 必须是,则返回 true
    由安全协议发送,否则为假。
    Syntax : public boolean getSecure()
  11. getName() :返回 cookie 的名称。
    Syntax : public String getName()
  12. setValue() :初始化后为 cookie 分配新值。
    Syntax : public void setValue(String newValue)
    Parameters :
    newValue - a String specifying the new value
  13. getValue :返回 cookie 的值。
    Syntax : public String getValue()
  14. getVersion() :如果 cookie 符合原始 Netscape 规范,则返回 0; 1 如果 cookie 符合 RFC 2965/2109
    Syntax : public int getVersion()
  15. setVersion() :用于设置此 cookie 使用的 cookie 协议的版本。
    Syntax :public void setVersion(int v)
    Parameters :
    v - 0 for original Netscape specification; 1 for RFC 2965/2109
    
  16. clone() :返回此 cookie 的副本。
    Syntax : public Cookie clone()

下面是一个简单的 servlet 程序的Java实现,当用户第一次请求它时,它在浏览器中存储一个 cookie,然后对于进一步的请求,它会显示存储的 cookie。

// Java program to illustrate methods
// of Cookie class
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
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 cookieTest
 */
@WebServlet("/cookieTest")
public class cookieTest extends HttpServlet 
{
    private static final long serialVersionUID = 1L;
  
    /**
     * @see HttpServlet#HttpServlet()
     */
    public cookieTest() {
        super();
        // TODO Auto-generated constructor stub
    }
  
    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
     *      response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException 
    {
  
        response.setContentType("text/html");
        // Create a new cookie with the name test cookie
        // and value 123
        Cookie cookie = new Cookie("test_cookie", "123");
  
        // setComment() method
        cookie.setComment("Just for testing");
  
        // setDomain() method
        // cookie.setDomain("domain");
  
        // setMaxAge() method
        cookie.setMaxAge(3600);
  
        // setPath() method
        cookie.setPath("/articles");
  
        // setSecure() method
        cookie.setSecure(false);
  
        // setValue() method
        cookie.setValue("321");
  
        // setVersion() method
        cookie.setVersion(0);
  
        response.addCookie(cookie);
  
        PrintWriter pw = response.getWriter();
        pw.print("");
        Cookie ck[] = request.getCookies();
  
        if (ck == null) {
            pw.print("

This is first time the page is requested.

");             pw.print("

And therefore no cookies found

");         } else {             pw.print("

Welcome Again...Cookies found

");             for (int i = 0; i < ck.length; i++) {                    // getName() method                 pw.print("

Name :" + ck[i].getName() + "

");                    // getValue() method                 pw.print("

Value :" + ck[i].getValue() + "

");                    // getDomain() method                 pw.print("

Domain :" + ck[i].getDomain() + "

");                    // getPath() method                 pw.print("

Name :" + ck[i].getPath() + "

");                    // getMaxAge() method                 pw.print("

Max Age :" + ck[i].getMaxAge() + "

");                    // getComment() method                 pw.print("

Comment :" + ck[i].getComment() + "

");                    // getSecure() method                 pw.print("

Name :" + ck[i].getSecure() + "

");                    // getVersion() method                 pw.print("

Version :" + ck[i].getVersion() + "

");             }             pw.print("");            }         pw.close();     }        /**      * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse      *      response)      */     protected void doPost(HttpServletRequest request, HttpServletResponse response)             throws ServletException, IOException      {                doGet(request, response);     }    }

输出:以下输出来自网络浏览器 -
对于第一个请求:

This is first time the page is requested.
And therefore no cookies found.

对于第二个请求:

Welcome Again...Cookies found
Name :test_cookie
Value :321
Domain :null
Name :null
Max Age :-1
Comment :null
Name :false
Version :0

如何运行上述程序?

首先,确保您安装了一些服务器,例如 Apache Tomcat,并使用您正在使用的工具(例如 Eclipse)进行了配置。只需输入您正在使用的服务器目录的完整地址,即可在服务器或本地浏览器上运行上述程序。
CookieTest servlet,一个执行三个任务的 servlet:

  1. 首先,servlet 设置一个名为 test_cookie 的 cookie。程序中的其他行设置 cookie 的属性,例如 max age、domain、value 等。
  2. 其次,servlet 使用 request.getCookies 查找所有传入的 cookie 并显示它们的名称和其他相应的属性。
  3. 如果没有像第一次请求那样找到 cookie,则会显示一条简单的显示消息,告知这是对页面的第一次访问。

参考:官方Java文档