摘抄并整理后查

cookie 和 session 一般用来跟踪浏览器的用户身份

Session的存储方式

  1. 使用cookie:保存 session id 的方式可以采用 cookie,这样在交互过程中浏览器可以自动的把 JSESSIONID 发给服务器。

  如果客户端请求的 cookie 中不包含 JSESSIONID,服务端调用request.getSession() 时就会生成并传递给客户端,此次响应头会包含设置 cookie 的信息,如果客户端请求的 cookie 中包含 JSESSIONID,服务端调用 request.getSession() 时就会根据 JSESSIONID 进行查找对象,如果能查找到返回,否则就跟没传递 JSESSIONID 一样,重新生成。无论是直接浏览 url 还是 ajax 请求都会在客户端 cookie 生成 JSESSIONID。

  2. URL重写:由于 cookie 可以被认为的禁用,必须有其他的机制以便在 cookie 被禁用时仍然能够把 session id 传回给服务器,经常采用的一种技术叫做 URL 重写,就是把 session id 附加在 URL路径的后面,附加的方式也有两种,一种是作为 URL 路径的附加信息,另一种是作为查询字符串附加在 URL后面。网络在整个交互过程中始终保持状态,就必须在每个客户端可能请求的路径后面都包含这个 session id。

  jsessionid 跟一般的 url 参数传递的方式是不同的,不是作为参数跟在 “?” 后面,而是紧跟在 url 后面用 “;” 来分隔。这样在用户禁用cookie的时候我们也可以传递 jsessionid 来使用 session 了,只不过需要每次都把 jsessionid 作为参数跟在 url 后面传递。这样很麻烦,sun给我们提供了 2 个方法来使事情变得很简单:response.encodeURL() 和 response.encodeRedirectURL()。这 2 个方法会判断 cookie 是否可用,如果禁用了会解析出 url 中的 jsessionid,并连接到指定的 url 后面,如果没有找到 jsessionid ,会自动帮我们生成一个。

  这两个方法的区别,是在判断是否要包含 jsessionid 的逻辑上稍有不同。在调用 response.sendRedirect() 前,应该先调用 encodeRedirectURL() 方法,否则可能会丢失 session 信息。这两个方法的使用方法如:response.sendRedirect(response.encodeURL("/xx/xx.jsp"));。如果 cookie 没有禁用,我们在浏览器地址栏上看到的地址是 /xx/xx.jsp,如果禁用了 cookie,我们会看到 /xx/xx.jsp;jsessionid=L7bZL7bZL7bZL7bZL7bZ。所以,为慎重,应该在程序里的每一个跳转 url 上都使用这2个方法,来保证 session 的可用性。

Session的创建和删除

  Session的创建

  1)对于Jsp,若当前页面为浏览器访问 web 应用的第一个资源页面且 jsp 的 Page指定的 Session 属性的值为 true

  2)对于 Servlet,若当前 Servlet 为浏览器访问 web 应用的第一个资源时,使用 request.getSession() 或者 request.getSession(true) 创建

  Session的删除

  1)调用 session.invalidate() 方法

  2)卸载 web 应用

  3)超过了 HttpSession 的过期时间

Session 的超时管理

  WEB服务器无法判断当前的客户端浏览器是否还会继续访问,也无法检测客户端浏览器是否关闭,所以,即使客户已经离开或关闭了浏览器,WEB服务器还要保留与之前对应的 HttpSession 对象。

  随着时间的推移而不断增加新的访问客户端,WEB服务器内存中将会因此积累大量的不再被使用的 HttpSession 对象,并将最终导致服务器内存耗尽。

  WEB服务器采用 “超时限制”的办法来判断客户端是否还在继续访问,如果某个客户端在一定的时间内没有发出后续请求,WEB服务器则认为客户端已经停止了活动,结束与该客户端的会话并将与之对应的 HttpSession 对象变成垃圾。

  如果客户端浏览器超时后再次发出访问请求,WEB服务器则认为这是一个新的会话的开始,将为之创建新的 HttpSession 对象和分配新的会话标识号。

  会话超时间隔可以在 web.xml (Tomcat服务器或者 web应用程序)文件中设置,其默认值由 Servlet 容器定义。

<session-config>
<session-timeout>30</session-timeout>
</session-config>

Session 缺点

  • session 和 cookie是同一类型,如果用户将浏览器设置为不兼容任何 cookie,那么该用户就无法使用 Session变量,也不能用 cookie存储信息
  • 分布式情况下session共享需要特别处理

Cookie概述

  Cookie 译为小型文本文件或者小甜饼,web 应用程序利用 Cookie 在客户端缓存服务器端文件。Cookie 是以键值对形式存储在客户端主机硬盘中,由服务器端发送给客户端,客户端在下一次访问服务器端时,服务器端可以获取到客户端 cookie 缓存文件。

  cookie 可以由服务器端创建的,然后由服务器端发送给客户端,客户端以键值对形式存储 cookie。客户端再次访问服务端时,存储的 cookie 会保存在请求协议中,服务端可以获取上次存储的缓存文件内容。

  Cookie可以通过浏览器和服务器端生成, 存储在 http 请求头里面。

Cookie 的缺点

  • 多人公用一台计算机(导致用户名密码不安全)
  • Cookie 被删除时,部分信息可能出错
  • Cookie 会被附加在每次 http 请求协议中,增加流量
  • Cookie 使用明文传递,安全性低
  • 大小受限
  • Cookie 可以被用户禁用,禁用后系统中需要使用 cookie 的地方就不能用了

sessionStorage 和 localStorage

  HTML5中与本地存储相关的两个重要内容:web storage 与本地数据库。其中,web storage 存储机制是对 HTML4 中 cookie 存储机制的一个改善。由于 cookie 存储机制有很多缺点,HTML5不再使用它,转而使用改良后的 web storage 存储机制。本地数据库是 HTML5 新增的一个功能,使用它可以在客户端本地建立一个数据库,原本必须保存在服务端数据库中的内容现在可以直接保存在客户端本地,这大大减轻了服务器端的负担,同时也加快了访问数据的速度。

  我们知道,在HTML4 中可以使用 cookie 在客户端保存像用户名等简单的用户信息,但是通过长期的使用,你会发现,用cookie存储永久数据存在一些问题:

  大小(cookie大小在4KB),带宽(cookie是随HTTP事务一起被发送的,因此会浪费一部分带宽),复杂性(要正确操纵cookie很困难)

  针对这些问题,在 HTML5 中,重新提供了一种在客户端本地保存数据的功能 Web Storage

  具体说,Web Storage 又分为两种:

  1. sessionStorage:将数据保存在 session 对象中。

  2. localStorage:将数据保存在客户端本地的硬件设备中,即使浏览器被关闭了,该数据仍然存在,下次打开浏览器访问网站时仍然可以继续使用。

  这两者的区别在于,sessionStorage 为临时保存,而 localStorage 为永久保存。

  WebStorage 的目的是克服由 cookie 带来的一些限制,当数据需要被严格控制在客户端时,不需要持续的将数据发回服务器。

  WebStorage 两个主要目标:1)提供一种在 cookie 之外存储会话数据的路径   2)提供一种存储大量可以跨会话存在的数据的机制

  HTML5 的 WebStorage 提供了两种 API:localStorage 和 sessionStorage

  1. 生命周期:localStorage 的生命周期是永久的,关闭页面或浏览器后数据也不会消息,除非主动删除数据。sessionStorage 的生命周期是仅在当前会话下有效。sessionStorage 引入一个浏览器窗口概念,sessionStorage 是在同源的窗口中始终存在的数据。只要这个浏览器窗口没有关闭,即使刷新页面或者进入同源的另个页面,数据依然存在。但是 sessionStorage 在关闭了浏览器窗口后就会被销毁。同时独立的打开同一个窗口同一页面,sessionStorage 在是不一样的(因为,不同源了)。

  2. 存储大小:localStorage 和 sessionStorage 的存储数据大小一般都是 5MB

  3. 存储位置:localStorage 和 sessionStorage 都保存在客户端,不与服务器进行互相通信

  4. 存储内容类型:localStorage 和 sessionStorage 只能存储字符串类型,对于复杂的对象可以使用 ECMAScript 提供的 JSON 对象来处理

  5. 获取方式:window.localStorage   和  window.sessionStorage

  6. 应用场景:localStorage 常用于长期登录(+判断用户是否已登录),适合长期保存在本地的数据。  方法:

  setItem(key, value) —— 保存数据,以键值对的方式存储信息

  getItem(key) —— 获取数据,将键值传入,即可获取到对应的 value 值

  removeItem(key) —— 删除单个数据

  clear() —— 删除所有数据

  key(index) —— 获取某个索引的 key

cookie、session、sessionStorage和localStorage的更多相关文章

  1. cookie、sessionStorage和localStorage

    title: cookie.sessionStorage和localStorage toc: false date: 2018-09-25 16:49:57 cookie 由于HTTP协议是无状态的, ...

  2. cookie、sessionStorage和localStorage的区别

    cookie.sessionStorage.localStorage 都是用于本地存储的技术:其中 cookie 出现最早,但是存储容量较小,仅有4KB:sessionStorage.localSto ...

  3. cookie、sessionStorage、localStorage的区别?

    数据存储位置 三者都是存储在游览器本地的 区别在于cookie是服务器端写入的,而sessionStorage.localStorage是由前端写入的 生命周期 cookie的生命周期是由服务器端写入 ...

  4. cookie、 sessionStorage 、localStorage之间的区别和使用

    1.cookie:存储在用户本地终端上的数据.有时也用cookies,指某些网站为了辨别用户身份,进行session跟踪而存储在本地终端上的数据,通常经过加密.一般应用最典型的案列就是判断注册用户是否 ...

  5. 计算机浏览器存储技术cookie、sessionStorage、localStorage

    HTTP无状态协议是指协议对于事务处理没有记忆能力.会话跟踪协议的状态是指下一次传输可以"记住"这次传输信息的能力,无状态是指同一个会话(注意什么叫同一个会话)的连续两个请求互相不 ...

  6. Cookie、sessionStorage、localStorage的区别

    共同点:都是保存在浏览器端,且同源的.区别:cookie数据始终在同源的http请求中携带(即使不需要),即cookie在浏览器和服务器间来回传递.而sessionStorage和localStora ...

  7. 第139天:详解cookie、 sessionStorage 和localStorage

    1.cookie:存储在用户本地终端上的数据.有时也用cookies,指某些网站为了辨别用户身份,进行session跟踪而存储在本地终端上的数据,通常经过加密.一般应用最典型的案列就是判断注册用户是否 ...

  8. 【精】cookie、 sessionStorage 、localStorage之间的异同

    1.cookie:存储在用户本地终端上的数据.有时也用cookies,指某些网站为了辨别用户身份,进行session跟踪而存储在本地终端上的数据,通常经过加密.一般应用最典型的案列就是判断注册用户是否 ...

  9. cookie、sessionStorage、localStorage区别

    相同:不管sessionStorage localStorage 还是 cookie 都是存储用户数据的. 不同: 1.cookie的存储空间小, cookie的数据是会通过http请求带到服务器的( ...

  10. cookie,sessionstorage,localstorage区别

    都是保存在浏览器端,且同源的,区别如下: 1.携带 cookie数据始终在同源的http请求中携带(即使不需要),即cookie在浏览器和服务器间来回传递. 而sessionStorage和local ...

随机推荐

  1. 安装APK到android设备那些事儿

    APK是AndroidPackage的缩写,即Android系统的应用软件安装包(apk).APK是类似Symbian Sis或Sisx的文件格式.通过将APK文件直接传到Android模拟器或And ...

  2. java des 加密/解密

    JAVA实现 加密 注意:DES加密和解密过程中,密钥长度都必须是8的倍数 public byte[] desCrypto(byte[] datasource, String password) { ...

  3. phpStudy的安装和配置

    一,下载工具 官网:http://www.phpstudy.net/,选择自己要安装的版本 二.多个站点和域名配置 1.打开phpStudy=>点击“其它选项菜单”=>点击“站点域名管理” ...

  4. IDEA工具,配置相关笔记

    1.修改背景颜色(黑/白)File -> settings -> Editor -> Color Scheme -> General -> (Scheme选择Defaul ...

  5. maven命令行创建项目问题

    今天在命令行下创建maven项目,使用的是create命令,但是一直失败,网上查找原因说archetype:create命令已经过期,需要使用 archetype:generate 来进行代替 加上了 ...

  6. 线段树双tag+差分数组——cf1208E

    写了一上午 /* 对于每个数组a[],先排序然后从大到小把a[i]放进线段树更新 设a[i]的位置是pos,那么其可更新的区间是[pos,w-(li-pos)] 线段树结点保存 tag=now表示当前 ...

  7. CTSC2019

    (upd:随机立方体AC) 太菜了只会部分分.以后慢慢补坑吧…… 随机立方体: 30分: 正常人都能想到的的转移状态(我的确是弱智),从大往小填数,记录有多少个极大值点和三个方向上各占了多少.转移可以 ...

  8. BZOJ 1303: [CQOI2009]中位数图(思路题)

    传送门 解题思路 比较好想的思路题.首先肯定要把原序列转化一下,大于\(k\)的变成\(1\),小于\(k\)的变成\(-1\),然后求一个前缀和,还要用\(cnt[]\)记录一下前缀和每个数出现了几 ...

  9. springMVC整合swagger(亲自试验完全可用)

    swagger是什么: [plain] view plain copy Swagger 是一款RESTFUL接口的文档在线自动生成+功能测试功能软件.本文简单介绍了在项目中集成swagger的方法和一 ...

  10. 浅谈HP-Socket在物联网的应用

    原文链接:https://my.oschina.net/chrisforbt/blog/1669746 一.应用背景 去年公司成立了个项目——<智慧用电安全隐患监管服务平台>,计划是开发一 ...