Cookie

目录

1. 问题描述

2. 别的应用场景

3. Cookie是什么?

4. 在java中Cookie被当做类来处理

5. java中如何创建Cookie

6. 服务器可以一次向浏览器发送多个Cookie

7. 默认情况下cookie保留在浏览器缓存

8. Cookie什么时候发送给服务器

9. 默认情况下Cookie和什么路径绑定在一起

10. 设置Cookie的关联路径

11. 设置Cookie的有效期

12. 浏览器提交的Cookie服务器怎么接收

13. 浏览器禁用Cookie

14. 分析不登录时添加购物车

15. 分析十天内免登录


1. 问题描述

    在京东, 如果不登录, 将商品添加进购物车后关闭浏览器, (短时间内)下次再打开京东
    发现商品还在购物车中.
    如果我们登录京东后添加商品进购物车, 购物车里的商品会一直存在.
    这两个现象说明, 会话状态的保存可能在浏览器端(保存在硬盘里, 因为我们完全关闭浏览器之后它还在购物车, 其实也可以保存在内存中),
    也可能在服务器端(保存在数据库中)
    如果想将会话状态保留在客户端, 这时就需要Cookie

2. 别的应用场景

    十天内免登录

3. Cookie是什么?

    Cookie可以保存会话状态, 但是这个会话状态是保留在客户端上的
    只要Cookie清除或者Cookie失效, 这个会话状态就没有了
    Cookie是保存在浏览器客户端上的
    Cookie可以保存在浏览器的缓存中, 浏览器关闭Cookie就消失
    Cookie也可以保存在客户端的硬盘上, 浏览器关闭Cookie还在, 除非Cookie失效
    Cookie这种机制是Http协议规定的, 不止javaweb有

4. 在java中Cookie被当做类来处理

   使用new运算符可以创建Cookie对象, 而且Cookie由两部分组成
   分别是Cookie的name和value, name和value的类型都为String

5. java中如何创建Cookie

    Cookie cookie = new Cookie(String CookieName, String CookieValue);

6. 服务器可以一次向浏览器发送多个Cookie

        response.addCookie(cookie1);
        response.addCookie(cookie2);

    代码例子:
 

    public class CookieTestServlet extends HttpServlet {

        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 创建Cookie对象
        Cookie cookie1 = new Cookie("username", "zhangsan");
        Cookie cookie2 = new Cookie("pass", "zhangsan");
        // 将Cookie对象发送给浏览器客户端
        response.addCookie(cookie1);
        response.addCookie(cookie2);
        // 此时这两个cookie保存在浏览器的缓存中
        }
    }

7. 默认情况下cookie保留在浏览器缓存

   默认情况下, 服务器发送Cookie给浏览器之后, 浏览器将Cookie保存在缓存中, 只要不关闭浏览器, Cookie永远存在且生效
   当浏览器关闭后, 缓存中的Cookie被清除

8. Cookie什么时候发送给服务器

    浏览器会不会提交和发送这些cookie给服务器, 和请求路径有关
    请求路径和cookie是紧密关联的, 不同的路径会发送不同的Cookie

9. 默认情况下Cookie和什么路径绑定在一起

    例如: 请求服务器, 服务器生成Cookie, 并将Cookie发送给浏览器, 请求路径为"/a/b/c"
    此时这个Cookie和上级路径绑定在一起, 也就是和"a/b/"绑定, 现在访问"/a/b/任何"都会向客户端发送Cookie
    这里的任何可以是不带"/"(例如访问"/a/b/d")的, 也可以带"/"(例如访问"/a/b/XXX/xxx"), 也可以什么都没有(例如访问"/a/b/") 

10. 设置Cookie的关联路径

    cookie.setPath(String url);


    下面给出代码例子:

    public class CookieTestServlet extends HttpServlet {

        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 创建Cookie对象
        Cookie cookie1 = new Cookie("username", "zhangsan");
        Cookie cookie2 = new Cookie("pass", "zhangsan");

        // 设置Cookie的关联路径
        cookie1.setPath("/11/king/110");
        cookie2.setPath("/11/king/110");

        // 将Cookie对象发送给浏览器客户端
        response.addCookie(cookie1);
        response.addCookie(cookie2);
        // 此时这两个cookie保存在浏览器的缓存中
        }
    }


    测试如下数据:
    访问"/11/king/110", 结果携带Cookie
    访问"/11/king/111", 结果不携带Cookie
    访问"/11/king/110/1", 结果携带Cookie

    经过上面两次测试说明, 默认情况下, 如果不指定Cookie的绑定路径, 他默认和当前请求路径的上一路径绑定
    指定情况下, 和指定路径绑定, 可以理解为, 如果指定路径不是以"/"结尾, 它默认给你的指定路径加"/", 之后和默认路径的绑定方式保持一致

11. 设置Cookie的有效期

    默认情况下, 没有设置Cookie的有效时长, Cookie保存在浏览器的缓存中, 关闭浏览器缓存清理, Cookie消失
    可以通过设置有效时长, 以保证Cookie保存在硬盘文件中, 但是这个有效时长必须是>0的
    换句话说, 只要设置Cookie的有效时长(且时长>0), 那么这个Cookie将保留在客户端的硬盘文件中, 有效时长过去之后, 硬盘文件中的Cookie失效
    
    Cookie有效时长=0直接被删除
    Cookie有效时长<0不会被存储
    Cookie有效时长>0保存在客户端硬盘

    设置Cookie的有效时长

    void cookie.setMaxAge(int 秒数)

    下面给出代码例子:

    public class CookieTestServlet extends HttpServlet {

        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 创建Cookie对象
        Cookie cookie1 = new Cookie("username", "zhangsan");
        Cookie cookie2 = new Cookie("pass", "zhangsan");

        // 设置Cookie的有效期
        cookie1.setMaxAge(60 * 60 * 24);  // 设置有效期为一天
        cookie2.setMaxAge(60 * 60);  // 设置有效期为一个小时

        // 将Cookie对象发送给浏览器客户端
        response.addCookie(cookie1);
        response.addCookie(cookie2);
        // 此时这两个cookie保存在硬盘中
        }
    }

    抓包查看Cookie信息
    Set-Cookie: pass=zhangsan; Max-Age=3600; Expires=Wed, 05-May-2021 03:59:10 GMT
    Set-Cookie: username=zhangsan; Max-Age=86400; Expires=Thu, 06-May-2021 02:59:10 GMT

12. 浏览器提交的Cookie服务器怎么接收

    Cookie[] cookies = request.getCookies();

    这个方法可以返回空, 所以使用前要判空

        String cookieName = cookie.getName();  // 获取cookie的名字
        String cookieValue = cookie.getValue();  // 获取cookie的值

    例子:

    public class ReceiveCookieServlet extends HttpServlet {

        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        // 从request对象中获取所有Cookie
            Cookie[] cookies = request.getCookies();
            if (cookies != null) {
                 for (Cookie cookie : cookies) {
                     String cookieName = cookie.getName();
                     String cookieValue = cookie.getValue();
                     System.out.println(cookieName + "=" + cookieValue);
                 }
            }
        }
    }

    打印结果如下:
    username=zhangsan
    pass=zhangsan

13. 浏览器禁用Cookie

    这个代表服务器发送的Cookie浏览器不接收, 服务器还是会发送Cookie
    这个是在浏览器上设置的

14. 分析不登录时添加购物车

    当添加商品进购物车时, 服务器端会生成一个cookie信息, 这个cookie信息保存的是商品id列表信息(比如"'id0001','id1123','id4234'")
    服务器将这个cookie信息发送给浏览器客户端, 客户端的硬盘文件保存这个信息
    将来再次访问的时候, 浏览器向服务器提交cookie, 服务器取出这个cookie中的商品id, 从数据库中通过id查找详细信息, 交还个浏览器

15. 分析十天内免登录

    先判断用户名密码正不正确, 在判断是否选择十天内免登录
    如果上面判断都通过, 服务器将用户名和密码加密(md5)后保存进两个cookie中
    服务器发送cookie信息给浏览器, 并且设置有效时间为10天
    之后在登录的时候, 服务器将获取cookie中的加密用户名和密码信息, 和数据库中信息对比(数据库中的信息也是md5加密的)
    对照上了就登录

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值