前言:

  • session 和cookie都是为了保持服务器和客户端之间交互状态。如果一天的PV有几亿,而一个cookie占200个字节但是也会占用很多带宽?所以大访问量就引用session,但是几百台服务器集群之间 有无法实现共享session。

理解Cookie

  • 简单来说就是用户通过HTTP去访问服务器,然后服务器会返回一些key/value的数据给用户端,同时给这些数据加上一些限制条件,当用户再次访问服务器时,只要条件满足时就会被重新返回给服务器。W3C设计cookie最初是为了应对HTTP这种无状态协议去区分不同用户的,现在cookie也可以被用作服务器数据缓存判断的依据。
  • cookie属性项 ,目前分为了version0 和version1两个版本,常用的有max-age ,domain,expires,path等等,在Javaweb的servlet规范中,我们常用的set-cookie:user-name='hakulamatata';max-Age="1000"。
  • 客户端和服务端交互时,不需要每次都传递这么多次cookie ,这么做无疑是增加数据传输量。所以当客户端第一次连接到服务端,服务器会生成一个每个客户端唯一的ID,这个ID就是客户端保存着的 NAME =JSESIONID 的cookie,每次交互就把这个cookie id发过去 便于服务器识别。
  • 使用cookie的限制,虽然HTTP协议对于cookie的数量和占用空间大小是没有限制的,但是现代基本浏览器(主要指支持html5的浏览器) 对于数量限制基本都是每个域名不超过50个 ,占用空间而言 基本除了谷歌是 80000个字节,其他都是4095个字节。
  • cookie安全问题:容易想到既然cookie保存在客户端,就难免被他人利用篡改或者进行其他我们预料之外的操作,相比而言存放在服务端的 session就安全些,所以一些敏感信息 更适于存放在session里。
  • cookie压缩问题。如果大型网站PV上亿的那种,带宽和流量而言,压缩cookie很有必要,而根据cookie的规范 ,cookie只能是ASCII码为34-126的可见字符,所以我们必须使用Base64进行编解码,然后再利用gzip和deflate等压缩算法进行压缩,节省流量带宽成本。

理解session

  • 前面讲过,web交互过程中不可能每次都把cookie都传回服务端,而是用一个 jesesionid的id 的cookie,这是session 的一种方式,还有基于 url 这两个都是默认支持的,最后还有一个是SSL的,这个不是默认支持的。当web.xml 配置了 session就会 以配置的 为sessionid,没配置就是以默认的jesesionid 为准,而url 则是以url传回的K-V键值对为依据构建 sessionid,而最后一种特殊情况就是 javax.servlet.request.ssl_session属性值设置 sessionid。

Session 如何工作

  • 有了sessionid对象就可以去创建httpsesion对象了,第一次通过 request.getsession()方法,如果没有就创建新的,然后放到sessionmanager里面去管理,过期的就关闭,服务器关闭时就持久化到磁盘,只要有这个HTTPsession对象客户就可以获取这个对象,也就实现HTTP协议本身无状态,到技术实现其有状态的过程。

扩展问题

  • 表单重复提交:就是在用户请求,在表单隐藏域中添加一个根据某个种子生成的随机数,也就是 token ,然后存放在session中,当用户提交表单时,在和这个存放在session中的对比,如果不同就是重复提交,如图

  • 多端session统一:主要涉及多端共享session,其次就是如图过程。

Java Web 深入分析(9) Session 和 Cookie的更多相关文章

  1. Java Web Application使Session永不失效(利用cookie隐藏登录)

    在做 Web Application 时,因为 Web Project 有 session 自动失效的问题,所以如何让用户登录一次系统就能长时间运行三个月,就是个问题. 后来,看到 session 失 ...

  2. Java Web(三) 会话机制,Cookie和Session详解

    很大一部分应该知道什么是会话机制,也能说的出几句,我也大概了解一点,但是学了之后几天不用,立马忘的一干二净,原因可能是没能好好理解这两种会话机制,所以会一直遗忘,一直重新回过头来学习它,今天好好把他总 ...

  3. Java Web(三) 会话机制,Cookie和Session详解(转载)

    https://www.cnblogs.com/whgk/p/6422391.html 很大一部分应该知道什么是会话机制,也能说的出几句,我也大概了解一点,但是学了之后几天不用,立马忘的一干二净,原因 ...

  4. java web 学习十一(使用cookie进行会话管理)

    一.会话的概念 会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话. 有状态会话:一个同学来过教室,下次再来教室,我们会知道这个同学曾 ...

  5. [原创]java WEB学习笔记30:Cookie Demo 之显示最近浏览的记录

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  6. A candidate solution for Java Web Application - current session

    Motivation Do it once, resue for ever. Audience myself, Java Web developers Scope 应用案例 图书借阅系统 阶段1需求: ...

  7. web 开发常见问题--Session 与 Cookie 却别

    总结: 1.首先,session与cookie都是保存数据的,存在的原因很大程度上是为了解决HTTP协议的无状态特性 2.都是保存数据,却别在于cookie保存在客户端,由浏览器管理,session保 ...

  8. Java Web 深入分析(6) Tomcat

    tomcat是什么:汤姆猫?Javaweb服务器? Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache ...

  9. JSON WEB TOKEN - 告别session和cookie - java demo

    JWT简介 JWT认证流程: 用户登录成功,生成token,返回一个对象(包含token,用户名) 每次请求都带上这个对象(通过js存储在电脑) jwt过滤器会校验token解密之后的name是否和用 ...

随机推荐

  1. redis不支持多个数据库实例但是支持多个字典

    Redis多个数据库 注意:Redis支持多个数据库,并且每个数据库的数据是隔离的不能共享,并且基于单机才有,如果是集群就没有数据库的概念. Redis是一个字典结构的存储服务器,而实际上一个Redi ...

  2. ps 快捷键大全

    一.工具箱(多种工具共用一个快捷键的可同时按[Shift]加此快捷键选取)矩形.椭圆选框工具 [M]移动工具 [V]套索.多边形套索.磁性套索 [L]魔棒工具 [W]裁剪工具 [C]切片工具.切片选择 ...

  3. 002-02-RestTemplate-初始化调用流程

    一.简述 调用 RestTemplate 的默认构造函数,RestTemplate 对象在底层通过使用 java.net 包下的实现创建 HTTP 请求,可以通过使用 ClientHttpReques ...

  4. MERN——MongoDB && React && Node && Express

    原文链接:Let’s build a full stack MongoDB, React, Node and Express (MERN) app github源码地址:jelorivera08/re ...

  5. SpringCloud学习成长之路 五 路由器网关

    在微服务架构中,需要几个基础的服务治理组件,包括服务注册与发现.服务消费.负载均衡.断路器.智能路由.配置管理等,由这几个基础组件相互协作,共同组建了一个简单的微服务系统.一个简答的微服务系统如下图: ...

  6. MySQL数据库表的设计和优化(上)

    一.单表设计与优化: (1)设计规范化表,消除数据冗余(以使用正确字段类型最明显):数据库范式是确保数据库结构合理,满足各种查询需要.避免数据库操作异常的数据库设计方式.满足范式要求的表,称为规范化表 ...

  7. centos7安装配置gitlab详细教程

    一. 安装并配置必要的依赖关系在CentOS系统上安装所需的依赖:ssh,防火墙,postfix(用于邮件通知) ,wget,以下这些命令也会打开系统防火墙中的HTTP和SSH端口访问. 1.安装ss ...

  8. Linux清除痕迹

    Linux清除痕迹 第一种方法: 在退出会话前直接执行: #history -r 清除当前会话的命令历史记录 第二种方法: 在vim中执行自己不想让别人看到的命令 随便用vim打开一个文件 :set ...

  9. linux下的进程间通信之共享内存

    概念:这种机制允许两个或多个进程通过把公共数据结构放入一个共享内存区来访问它们.如果进程要访问这种数据结构所在的共享内存区,就必须在自己的地址空间中增加一个新线性区,新线性区映射与这个共享内存区相关的 ...

  10. [转载]Oracle中TO_NUMBER()函数的用法

    1 用法简介TO_NUMBER函数()是Oracle中常用的类型转换函数之一,主要是将字符串转换为数值型的格式,与TO_CHAR()函数的作用正好相反. To_number函数的格式如下: To_nu ...