cookie和session详解

1、cookie

1.1 简介

Cookie,有时也用其复数形式Cookies,指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)。Cookie总是保存在客户端中,按在客户端中的存储位置,可分为内存Cookie和硬盘Cookie。内存Cookie由浏览器维护,保存在内存中,浏览器关闭后就消失了,其存在时间是短暂的。硬盘Cookie保存在硬盘里,有一个过期时间,除非用户手工清理或到了过期时间,硬盘Cookie不会被删除,其存在时间是长期的。所以,按存在时间,可分为非持久Cookie和持久Cookie。

  • 非持久Cookie:是指没有设在cookie的Expires(有效期)的属性,此时cookie将停留在客户端的内存中。
  • 持久Cookie:是指在你设置了cookie的Expires(有效期)属性,此时cookie将保存到你的硬盘上。
1.2 cookie存储格式

每个 cookie 都以名/值对的形式,即 name=value,名称和值都必须是URL编码的,且两对cookie间以分号和空格隔开。(ps:千万不要忘了空格,特别是在获取某个 cookie 时)

1.3 cookie属性

Domain(域):Cookie的域;浏览器只向指定域中的服务器主机名发送Cookie,这样服务器就将Cookie限制在了特定的域中。jianshu.com域就与jianshu1.jianshu.com和jianshu1.jianshu2.jianshu.com相匹配,但与js.com就不匹配了。
Path(路径):通过这个属性可以为服务器上特定的文档分配Cookie,如果Path属性是一个URL路径前缀,就可以附加一个Cookie,路径/foo,与/foobar和foo/bar.html相匹配,路径"/"与域名中所有的内容都匹配。
Secure(安全):是否只有在HTTP使用SSL连接时才发送这个Cookie;
expires(过期):从格林尼治标准时间1970年1月1日00:00:00开始的过期秒数;
name(名字):Cookie变量的名字;
value(值):Cookie变量的值;

1.4 cookie作用

Cookie 可以作为全局变量,这是它最大的一个优点。它最根本的用途是 Cookie 能够帮助 Web 站点保存有关访问者的信息,以下列举cookie的几种小用途。

  • 保存用户登录信息。这应该是最常用的了。当您访问一个需要登录的界面,例如微博、百度及一些论坛,在登录过后一般都会有类似"下次自动登录"的选项,勾选过后下次就不需要重复验证。这种就可以通过cookie保存用户的id。

  • 创建购物车。购物网站通常把已选物品保存在cookie中,这样可以实现不同页面之间数据的同步(同一个域名下是可以共享cookie的),同时在提交订单的时候又会把这些cookie传到后台。

  • 跟踪用户行为。例如百度联盟会通过cookie记录用户的偏好信息,然后向用户推荐个性化推广信息,所以浏览其他网页的时候经常会发现旁边的小广告都是自己最近百度搜过的东西。这是可以禁用的。

1.5 cookie被禁用之后如何处理

我们知道在IE中,我们可以在工具的Internet选项中把Cookie禁止,那么会不会出现把客户端的Cookie禁止了,那么SESSIONID就无法再用了呢?找了一些资料说明,可以有其他机制在COOKIE被禁止时仍然能够把Session id传递回服务器。

  • 经常被使用的一种技术叫做URL重写,就是把Session id直接附加在URL路径的后面一种是作为URL路径的附加信息,表现形式为:http://…./xxx;jSession=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764;
  • 另一种是作为查询字符串附加在URL后面,表现形式为:http://…../xxx?jSession=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764
  • 还有一种就是表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把Session id传递回服务器。
1.6 浏览器请求时什么时候选择携带cookie

Cookie请求头字段是客户端发送请求到服务器端时发送的信息(满足一定条件下浏览器自动完成,无需前端代码辅助)。当满足下面条件时,浏览器发送请求会携带cookie:

  • 浏览器的cookie列表中含有domain属性为需要访问链接的域名或者子域名。
  • 都是http或者https,或者不同的情况下Secure属性为false
  • 要发送请求的资源路径跟浏览器端Cookie的path属性必须一致,或者是浏览器端Cookie的path的子目录。

2、session

2.1 简介

由于HTTP协议是无状态的协议,所以当服务端需要记录用户状态时,就需要用某种机制来识别具体的用户,这个机制就是Session。session机制采用的是在服务器端保持HTTP状态信息的方案。服务器使用一种类似于散列表的结构来保存信息。当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否包含了一个session标识(即sessionid),如果已经包含一个sessionid则说明以前已经为此客户创建过session,服务器就按照sessionid把这个session检索出来使用。如果客户请求不包含sessionid或者session已经过期,则为此客户创建一个session并为此客户创建一个session并且生成一个与此session相关联的sessionid,这个sessionid将在本次响应中通过cookie的方式返回给用户端保存。

2.2 session存储格式

Tomcat 中的 Session 是放在 org.apache.catalina.session.ManagerBase 类中,以 HashMap 格式存放,key 为 sessionId, value 为 org.apache.catalina.Session 接口,这个接口由 org.apache.catalina.session.StandardSession 类实现,这个类同时实现了HttpSession 接口。下面是session几种常用存储形式:

  • 保存在服务器进程中:
      保存在服务器进程中是指把Session数据保存在服务器的运行进程中,这也是默认的Session的存方式,也是最常用的。这种方式的优点是简单,性能最高。但是当重启服务器时Session丢失。
  • 保存在StateServer上
      这种存储模式是指将Session数据存储在一个称为Asp.Net状态服务进程中,该进程独立于Asp.Net辅助进程或IIS应用程序池的单独进程,使用此模式可以确保在重新启动Web应用程序时保留会话状态,并使会话状态可以用于网络中的多个Web服务器。
  • 保存在SQL Server数据库中
      可以配置把Session数据存储到SQL Server数据库中,为了进行这样的配置,程序员首先需要准备SQL Server数据服务器,然后在运行.NET自带安装工具安装状态数据库。这种方式在服务器挂掉重启后都还在,因为他存储在内存和磁盘中。
2.3 session属性

Contents集合:包含所有通过脚本命令添加到应用程序中的数据项
SessionID属性:用来标识每一个Session对象
TimeOut属性:用来设置Session会话的超时时间(以分钟表示)
Abandon方法:强行删除当前会话的Session对象,释放系统资源
Session_OnStart事件:建立Session对象时所激发的事件
Session_OnEnd事件:结束Session对象时所激发的事件
StaticObjects集合:包含所有通过标记添加到应用程序中的对象

2.4 session作用

Session的根本作用就是在服务端存储用户和服务器会话的一些信息。以下列举session作用的几种小用途。

  • 判断用户是否登录。对于登陆后显示的页面可以通过过滤器验证用户session是否存在,如果存在可以跳过登录操作直接显示,不存在跳转登录界面。

  • 购物车功能。用户登录之后,在购物车添加或者删除商品,可以通过session来标识用户和保存商品信息,减少数据库交互操作。

2.5 session对象的销毁时机

session对象默认30分钟没有使用,则服务器会自动销毁session,在web.xml文件中可以手工配置session的失效时间。当需要在程序中手动设置Session失效时,可以手工调用session.invalidate方法,摧毁session。

3、session和cokie区别

  • 存放位置不同
    Cookie保存在客户端,Session保存在服务端。

  • 存取方式的不同
    Cookie中只能保管ASCII字符串,假如需求存取Unicode字符或者二进制数据,需求先进行编码。Cookie中也不能直接存取Java对象。若要存储略微复杂的信息,运用Cookie是比拟艰难的。而Session中能够存取任何类型的数据,包括而不限于String、Integer、List、Map等。Session中也能够直接保管Java Bean乃至任何Java类,对象等,运用起来十分便当。能够把Session看做是一个Java容器类。

  • 安全性(隐私策略)的不同
    Cookie存储在浏览器中,对客户端是可见的,客户端的一些程序可能会窥探、复制以至修正Cookie中的内容。而Session存储在服务器上,对客户端是透明的,不存在敏感信息泄露的风险。 假如选用Cookie,比较好的方法是,敏感的信息如账号密码等尽量不要写到Cookie中。最好是像Google、Baidu那样将Cookie信息加密,提交到服务器后再进行解密,保证Cookie中的信息只要本人能读得懂。而假如选择Session就省事多了,反正是放在服务器上,Session里任何隐私都能够有效的保护。

  • 有效期上的不同
    只需要设置Cookie的过期时间属性为一个很大很大的数字,Cookie就可以在浏览器保存很长时间。 由于Session依赖于名为JSESSIONID的Cookie,而Cookie JSESSIONID的过期时间默许为–1,只需关闭了浏览器(一次会话结束),该Session就会失效。

  • 对服务器造成的压力不同
    Session是保管在服务器端的,每个用户都会产生一个Session。假如并发访问的用户十分多,会产生十分多的Session,耗费大量的内存。而Cookie保管在客户端,不占用服务器资源。假如并发阅读的用户十分多,Cookie是很好的选择。

  • 跨域支持上的不同
    Cookie支持跨域名访问,例如将domain属性设置为“.baidu.com”,则以“.baidu.com”为后缀的一切域名均能够访问该Cookie。跨域名Cookie如今被普遍用在网络中。而Session则不会支持跨域名访问。Session仅在他所在的域名内有效。

4、session和cokie交互流程

  • 当用户通过浏览器首次访问目标服务器的时候,如果访问JSP、Servlet等程序时,目标服务器会创建与当前客户端对应的session对象和用于标识session对象的sessionid;
  • 请求处理完成后,目标服务器会将当前客户端的session对象对应的sessionid放到本次请求返回的响应头的set-cookie中返回给用户端;
  • 客户端拿到返回的sessionid之后,会将拿到的sessionid存放到domain属性值为目标服务器域名的cookie对象中;
  • 下一次请求目标服务器的时候,浏览器请求会携带sessionid访问目标服务器;
  • 目标服务器收到客户端再次请求后,会首先检查这个客户端的请求里是否包含了一个session标识(即sessionid),如果已经包含一个sessionid则说明以前已经为此客户创建过session,服务器就按照sessionid把这个session检索出来使用。如果客户请求不包含sessionid或者session已经过期,则为此客户创建一个session并为此客户创建一个session并且生成一个与此session相关联的sessionid;
  • 如果session已经过期,请求处理完成后,目标服务器会将新的sessionid放到本次请求返回的响应头的set-cookie中返回给用户端;
  • 浏览器拿到返回的sessionid,会更新与目标服务器域名对应的cookie信息。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值