Cookie

Cookie

Cookie的作用

  Cookie的英文原意是“点心”,它是用户访问Web服务器时,服务器在用户硬盘上存放的信息,好像是服务器送给客户的“点心”。

  服务器可以根据Cookie来跟踪用户,这对于需要区别用户的场合(如电子商务)特别有用。

  通常访问论坛时,如果勾选“保存用户名和密码”,服务器就会在你的硬盘上存放一个Cookie;再次访问时,服务器就会利用这个Cookie中存的上次访问的用户名和密码,实现自动登录。

  浏览器为了安全考虑,只允许服务器访问自己存放的Cookie,即A服务器存的Cookie,B服务器是访问不到的,禁止跨域访问。

  并且Cookie存放时都是加密的,不是直接存明文的。

Cookie的具体形式

  一个Cookie包含一对Key/Value,下面的代码生成一个Cookie并将它写到用户的硬盘上:

             Cookie theCookie = new Cookie("cookieName", "cookieValue");

             response.addCookie(theCookie);

Cookie类

  Cookie的类定义可以查看Java EE的javax.servlet.http.Cookie类文档:

  一个cookie是一个量很小的信息,是servlet发送给浏览器的,浏览器会存储在客户端,之后用到的时候会返回给服务器。

  因为cookie的值可以唯一地确定(或者说认证)一个客户端,所以cookie通常是用来进行session管理的。

  Cookie有一个name,一个value,还有一些其他的附加属性,比如comment,path,domain qualifiers,最大年龄(max age),版本号等。

  但是注意有的浏览器在处理Cookie的附加属性的时候可能会有bug,所以为了兼容性着想,要保守地使用附加属性。

Cookie的发送和返回

  servlet向浏览器发送cookies是通过:HttpServletResponse#addCookie方法,它是将字段加在HTTP response的headers里面来发送cookies的,这个方法每次只能加一条cookie,可以多次调用,增加多个不同的cookie对象。

  The browser is expected to support 20 cookies for each Web server, 300 cookies total, and may limit cookie size to 4 KB each.

  浏览器向servlet返回cookies,是通过将字段加在HTTP request的headers里面。使用HttpServletRequest#getCookies方法可以获取请求中的Cookies。

  一些Cookies可能有相同的名字但是不同的path属性。

Cookie的Max Age

  查看Cookie类的setMaxAge(int expiry)方法说明:

  这个类用于给Cookie设置最大的年龄,以秒为单位。

  expiry - an integer specifying the maximum age of the cookie in seconds; if negative, means the cookie is not stored; if zero, deletes the cookie.

  如果这个方法的参数给的是正值,表明cookie在超过指定的年龄时间后会消亡。

  负值意味着cookie不是永久性存储的,在浏览器关闭的时候将会被删除。

  这个方法的参数如果是零值将会导致cookie被删除。

测试程序Servlet

复制代码
package com.mengdd.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CookieServlet extends HttpServlet {

    private int counter1;
    private int counter2;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {

        Cookie cookie = new Cookie("cookieName" + counter1++, "cookieValue"
                + counter2++);

        cookie.setMaxAge(10);// 设置Cookie的最大存活时间为10秒钟

        resp.addCookie(cookie);// 将cookie增加在响应对象上

        // 从请求中获取客户端的Cookie
        Cookie[] cookies = req.getCookies();

        if (null == cookies) {
            // 如果没有cookie,返回的是null,而不是空数组
            return;
        }

        for (Cookie c : cookies) {
            System.out.println("Cookie name: " + c.getName()
                    + ", Cookie value: " + c.getValue());
        }

    }
}
复制代码

  启动Tomcat测试,可以看到旧的Cookie会随着时间的流逝而消失(根据编号判断)。

测试程序JSP

复制代码
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
    String path = request.getContextPath();
    String basePath = request.getScheme() + "://"
            + request.getServerName() + ":" + request.getServerPort()
            + path + "/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">

<title>My JSP 'jspCookie.jsp' starting page</title>

<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->

</head>

<body>

    <%!int count1 = 0;
    int count2 = 0;%>

    <%
        Cookie cookie = new Cookie("cookieName" + count1++, "cookieValue"
                + count2++);

        cookie.setMaxAge(10);

        response.addCookie(cookie);
    %>

    <%
        Cookie[] cookies = request.getCookies();
        if (null == cookies) {
            return;
        }

        for (Cookie c : cookies) {
    %>


    <p>
        <b>cookie name: </b><%=c.getName()%><br> 
        <b>cookie value: </b><%=c.getValue()%>
    </p>
    <%
        }
    %>
</body>
</html>
复制代码

参考资料

  圣思园张龙老师Java Web教学视频33-34集。

原文地址:https://www.cnblogs.com/liu-Gray/p/4868691.html