目录

  • 什么是Cookie?
  • 作用
  • 实现原理
  • Cookie的操作
  • Cookie的共享问题
  • Cookie的缺陷
  • Code

拓展: JavaScript中cookie使用


Cookie

什么是Cookie?

跳转到目录
Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户的各自的浏览器.当用户使用浏览器去访问服务器中的web资源时,以后每次请求都将之前保存的共享数据发送到服务器.

作用

跳转到目录
实现会话跟踪.

实现原理

跳转到目录

  • 客户端发送请求给服务器
  • 服务器发送响应头set-cookie并携带数据给客户端
  • 客户端将响应头携带的数据保存到客户端浏览器中
  • 下一次请求客户端会使用消息头cookie数据携带给服务器
  • 服务器获取消息头中的数据


    流程: 首先客户端填写用户名和密码登录请求服务器, 服务器接收到请求参数(用户名或密码)之后将它们保存到Cookie中(Cookie c = new Cookie("用户名 key", "value"), 多个key-value,创建多个cookie, 将cookie对象通过response.addCookie(c)写回到客户端,。当下次客户端要登录的时候, 就直接携带请求头中的cookie内容进行登录即可!

Cookie的操作

跳转到目录

  • 创建Cookie对象
    Cookie cookie = new Cookie(String name, String value);
    name: 当前Cookie取的唯一名字.
    value: 存储在Cookie的共享数据,只能是字符串类型.

    Cookie cookie = new Cookie("currentName", "ZYGui");
    
  • 把Cookie放入响应中,响应给浏览器,把共享的数据存储到浏览器中
    response.addCookie(cookie);

  • 获取Cookie及里面的数据
    Cookie[] cs = request.getCookie();

  • 修改Cookie中指定的属性名的属性值
    A. 重新创建一个新的Cookie,创建一个同名的新的Cookie.
    Cookie c = new Cookie("currentName", "GZY");
    B. 先获取到要修改的Cookie对象,再调用setValue(String newValue)重新设置
    注意:修改Cookie中的数据,需要再次发送给浏览器. response.addCookie(c);

  • 操作Cookie的生命周期,默认是在关闭浏览器的时候销毁

    • 会话Cookie: 关闭浏览器之后,Cookie就销毁了. 缺省情况
    • 持久化Cookie: Cookie可以保存指定的时间段.
      设置Cookie的最大存活时间: cookie.setMaxAge(int seconds);
      seconds = 0: 删除Cookie;
      seconds < 0: 会话Cookie
      seconds > 0: 存储指定的秒数.
  • 删除Cookie
    cookie.setMaxAge(0);

  • Cookie 中的key和value不支持中文

    • 先对中文字符串进行编码
    • 获取之后在进行解码

Cookie共享问题

跳转到目录

  • Cookie的路径
    Cookie在创建的时候,会根据当前的Servlet的相对路径来设置自己的路径
    Servlet的相对路径(url-pattern最后的/前面的路径)
    比如Servlet的url-pattern为/cookie/login,相对路径:/cookie/
    问题: 此时,只有在访问路径为/cookie/下面的资源的时候,才会将该Cookie发送到服务器
    解决方案:设置Cookie的路径
    void setPath(String uri)
    cookie.setPath("/项目名称");表示当前应用中的所有的资源都能够共享该Cookie信息
    为什么要设置路径,当访问某些页面时,不希望携带cookie.此时就可以设置cookie的携带路径.
    路径写法: /项目名称, 所有项目中添加cookie,访问时都会携带.
    设置 /项目名称/p, 此时只访问/p时,才携带cookie,其他路径不携带.

  • 域范围
    在多个应用之间实现数据共享,那么需要设置域范围,比如:

    news.baidu.com
    map.baidu.com

    cookie.setDomain("baidu.com");

Cookie的缺陷

跳转到目录

  1. 获取Cookie信息很麻烦
  2. Cookie不支持中文
  3. 一个Cookie只能存储一个字符串类型的数据
  4. Cookie的在浏览器中有数量的限制
    一个浏览器对一个站点最多存储20Cookie信息
    一个浏览器最多只能够存储300个Cookie
  5. 共享数据时保存在浏览器中的,容易造成数据的泄露(不安全)

最好的解决方案: 将数据保存在服务端(Session)

Code

跳转到目录

  • LoginServlet

    @WebServlet("/cookie/login")
    public class LoginServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("UTF-8");response.setContentType("text/html;charset=utf-8");PrintWriter out = response.getWriter();String username = request.getParameter("username");// 创建Cookie,存储数据Cookie c = new Cookie("currentName", username);c.setPath("/"); // 整个应用中都可以共享//        c.setMaxAge(15);  设置15秒后cookie销毁// 把cookie响应给浏览器response.addCookie(c);out.println("欢迎:"+username+"<br>");out.println("<a href='/abc/list'>收件箱</a>");}
    
  • ListServlet
    @WebServlet("/abc/list")
    public class ListServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("UTF-8");response.setContentType("text/html;charset=utf-8");PrintWriter out = response.getWriter();String username = "";// 获取Cookie的内容Cookie[] cookies = request.getCookies();if (cookies != null) {for (Cookie cookie : cookies) {String name = cookie.getName();String value = cookie.getValue();if ("currentName".equals(name)) {username = value;}}}out.println("欢迎:" + username + "<br>");for (int i = 0; i < 5; i++) {out.println("<a href='/cookie/get'>一封邮件</a><br>");}}
    
  • GetServlet
    @WebServlet("/cookie/get")
    public class GetServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("UTF-8");response.setContentType("text/html;charset=utf-8");PrintWriter out = response.getWriter();String username = "";// 获取Cookie的内容Cookie[] cookies = request.getCookies();for (Cookie cookie : cookies) {String name = cookie.getName();String value = cookie.getValue();if ("currentName".equals(name)){username = value;}}out.println("欢迎:"+username+"<br>");out.println("欢迎收看!");}
    

会话技术——Cookie相关推荐

  1. 会话技术Cookie

    1.会话技术的概念 会话∶浏览器和服务器之间的多次请求和响应. 为了实现一些功能,浏览器和服务器之间可能会产生多次的请求和响应,从浏览器访问服务器开始,到访问服务器结束(关闭浏览器.到了过期时间).这 ...

  2. java ee会话_Java EE会话技术Cookie和Session

    会话技术 一.定义 会话技术是帮助服务器记住客户端状态的(区分客户端的).将客户访问的信息存在本地的叫Cookie技术,存在服务器上的叫Session技术. 注意: 一次会话何时开始?从打开一个浏览器 ...

  3. PHP自学之路----会话技术(cookie session)

    会话技术 l  什么是会话 打开浏览器,访问某个网站的很多资源(页面=)通过超链接),当你关闭浏览器后,一个会话结束. l  思考一个问题 在意个会话中,用户会产生一些数据,比如购物车,每个用户查看购 ...

  4. 会话技术 —— Cookie 实现原理 || 在idea编辑器中设置代码的模板

    会话技术 1. 会话:一次会话中包含多次请求和响应.     * 一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止 2. 功能:在一次会话的范围内的多次请求间,共享数据 3. ...

  5. PHP会话技术cookie

    为什么要使用会话技术 我们在浏览网站的时候,访问每一个Web页面都是使用HTTP协议来实现的.由于HTTP协议是一个无状态的协议.这就会导致当一个用户请求一个页面以后,再请求该网站的其他页面,HTTP ...

  6. 四、PHP基础——会话技术Cookie 和 Session

    会话技术初步认识 会话技术介绍 web会话可简单理解为:用户开一个浏览器,访问某一个web站点,在这个站点点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话. HTTP协 ...

  7. Java Web 项目入门指南(http、Servlet、Request、Response、ServletContext、会话技术[cookie、session]、Filter、Listener)

    概述 web 服务器.项目.资源概述 web 服务器:可以被浏览器访问到的服务器 常见的 web 服务器: tomcat:中小型的服务器软件,免费开源,支持 JSP 和 Servlet apache ...

  8. Java中 操作Servlet域中的值以及会话技术 cookie

    XML文件<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="ht ...

  9. 大数据WEB阶段(十二)会话技术、Cookie、Session及两者的区别

    会话技术 – Cookie与Session及其两者的区别 (一)会话技术 一.概述 1. 一个浏览器为了实现某一个功能对服务器产生了多次请求响应.从第一个请求开始访问服务器,会话开始,到最后一个页面访 ...

  10. Java Web 七 会话技术 八 Cookie 九 Session

    七 会话技术 打开浏览器,访问服务器中资源,关闭浏览器:这个过程就是会话 分类 * Cookie会话技术:浏览器会话技术* Session会话技术:服务器会话技术 作用 解决ServletContex ...

最新文章

  1. Spring源码分析【0】-框架的基础:继承和接口调用链
  2. (0007) iOS 开发之Xcode8上传AppStore遇到的TencentOpenApi_IOS_Bundle.bundle
  3. nginx报http400错误解决方法
  4. 【Flutter】Flutter 布局组件 ( PhysicalModel 组件 )
  5. 80. Leetcode 1642. 可以到达的最远建筑 (堆-技巧三-事后小诸葛)
  6. weblogic查看内存情况
  7. java 常量存储_JAVA 存储空间 寄存器 堆栈 堆 常量存储 非RAM存储
  8. L3-2 至多删三个字符
  9. 微擎在线goto解密系统
  10. laravel 下载报错:Unable to guess the mime type as no guessers are available
  11. mongodb数据导入hbase,spark读取hbase数据分析
  12. 系统优化设计方案3.20周一例会
  13. Dockerfile自动创建镜像
  14. 32个参数累加_「机械设计教程」滚珠丝杠选型过程中考虑的9个参数
  15. python爬虫之cookie和session介绍——以12306验证码破解和浏览车次为例
  16. PassMark 更新排行,苹果 M1 杀疯了
  17. c语言中的整型常量和实型常量
  18. Module containing this breakpoint has not yet loaded or the breakpoint address not be obtained
  19. 如何读取PLC的寄存器地址和点表?
  20. lighttpd隐藏index.php,lighttpd开启rewrite伪静态方法 - 老牛博客

热门文章

  1. 如何在 Excel 中筛选数据透视表中的数据?
  2. 【Alpha】第四次Daily Scrum Meeting
  3. 怎样用计算机筛选,教您Excel中筛选功能怎么用
  4. 重装电脑系统完整教程
  5. ChatGPT 被玩挂了,我换成了微信官方对话机器人,简直了....
  6. 技术小卡系列之Eclipse 窗口说明
  7. python timer详解_Python timer定时器两种常用方法解析
  8. RPC开发系列九:优雅启动
  9. Nginx 企业级优化
  10. 高中数学竞赛与自主招生内部练习试题<二>