zoukankan      html  css  js  c++  java
  • 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());
            }
    
        }
    }
    CookieServlet

      启动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>
    jspCookie

    参考资料

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

  • 相关阅读:
    2017年系统架构设计师论文范文
    在SQL Server 2008中执行透明数据加密(转自IT专家网)
    开发笔记
    [置顶] GO-Gin框架快速指南
    [置顶] JS-逆向爬虫
    [置顶] ES篇
    [置顶] GO
    [置顶] 爬虫入狱指南
    [置顶] websocket
    [置顶] Linux篇
  • 原文地址:https://www.cnblogs.com/mengdd/p/3635360.html
Copyright © 2011-2022 走看看