cookie和session

会话技术


因为HTTP协议是无状态的,即服务器不知道用户上一次做了什么,这严重阻碍了交互式Web应用程序的实现。在典型的网上购物场景中,用户浏览了几个页面,买了一盒饼干和两饮料。最后结帐时,由于HTTP的无状态性,不通过额外的手段,服务器并不知道用户到底买了什么。为了做到这点,就需要使用到Cookie了。服务器可以设置或读取Cookies中包含信息,借此维护用户跟服务器会话中的状态。

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

Cookie


cookie的特性


cookie可以实现跨页面全局变量
cookie可以跨越同域名下的多个网页,但不能跨越多个域名使用
同一个网站中所有页面共享一套cookie
可以设置有效期限
存储空间4-10KB左右


cookie的优点

它的信息是存储在客户端的,每一次向服务器发送请求,cookie都会一起提交。它的优点是响应速度快;缺点就比较明显,它的安全性较低。

cookie机制将信息存储于用户硬盘,因此可以作为跨页面全局变量,这是它最大的一个优点

常用场合:

  1. 保存用户登录状态;
  2. 跟踪用户行为;
  3. 定制页 面;
  4. 创建购物车 …等等

cookie的缺点


(1)cookie可能被禁用;
(2)cookie与浏览器相关,不能互相访问;
(3)cookie可能被用户删除;
(4)cookie安全性不够高;
(5)cookie存储空间很小(只有4–10KB左右)


cookie细节

  • Cookie不可跨域名性

    很多人在初学的时候可能有一个疑问:在访问Servlet的时候浏览器是不是把所有的Cookie都带过去给服务器,会不会修改了别的网站的Cookie.

    答案是否定的。Cookie具有不可跨域名性。浏览器判断一个网站是否能操作另一个网站的Cookie的依据是域名。所以一般来说,当我访问baidu的时候,浏览器只会把baidu相关的Cookie带过去,而不会带上google的Cookie。

    Cookie在客户端是由浏览器来管理的。浏览器能够保证Google只会操作Google的Cookie而不会操作Baidu的Cookie,从而保证用户的隐私安全。浏览器判断一个网站是否能操作另一个网站Cookie的依据是域名。Google与Baidu的域名不一样,因此Google不能操作Baidu的Cookie。

    需要注意的是,虽然网站images.google.com与网站www.google.com同属于Google,但是域名不一样,二者同样不能互相操作彼此的Cookie。

cart.test.com/cart/findCartList
localhost:8888/cart/findCartList
域名和域名对应相同ip
这种情况属于跨域场景。又因为,Cookie具有不可跨域名性。所以无法获取同样的数据。
解决方案:初步定为统一访问方式

参考如下:

常见跨域场景

URL 说明 是否允许通信
http://www.domain.com/a.js
http://www.domain.com/b.js
同一域名,不同文件或路径 允许

http://www.domain.com/lab/c.js
http://www.domain.com:8000/a.js
http://www.domain.com/b.js
同一域名,不同端口 不允许

http://www.domain.com/a.js
https://www.domain.com/b.js
同一域名,不同协议 不允许

http://www.domain.com/a.js
http://192.168.4.12/b.js
域名和域名对应相同ip 不允许**

http://www.domain.com/a.js
http://x.domain.com/b.js
主域相同,子域不同 不允许

http://domain.com/c.js
http://www.domain1.com/a.js
http://www.domain2.com/b.js
不同域名 不允许*

  • Cookie 可以创建多个
  • Cookie 的保存时间
    1. 默认情况下。当浏览器关闭后,cookie数据被销毁
    2. 持久化存储:指定cookie存活时间,时间到后,cookie文件自动失效
  • Cookie共享问题:
    1. 假设在一个服务器中部署了多个项目,那么在这些web项目中的cookie在默认情况是不能共享的
      可以设置cookie 的path路径来设置cookie的获取范围

Session


Session原理

session 原理以及生命周期

  1. :session 是通过浏览器的cookie来保存一个jessionid的信息 。这个jsessionid里面包含着你session 的id 。正是通过这个jessionid浏览器才能判断是不同用户的session ,用户每次进行session.getAttribute()或则 session.setAttribute时候。都会取出jesseionid里面的信息和session id比较。来区分不通的session。
  2. session 的生命周期是一次会话。就是从用户开始请求这个application开始到application结束。 你停止了服务当然这个应用也就结束。tomcate容器出清除session

session原理
一般情况下,session都是存储在内存里,当服务器进程被停止或者重启的时候,内存里的session也会被清空,如果设置了session的持久化特性,服务器就会把session保存 到硬盘上。
你可以设置session的持久化特性试试看,当服务器进程重新启动或这些信息将能够被再次使用。
tomcat 正常关闭或者 restart 的话 tomcat 会在 work 的这个工程目录下有个 session.ser 文件,会保存在那里,重启时会重新加载。


Session概念

  • Session机制
    除了使用Cookie,Web应用程序中还经常使用Session来记录客户端状态。Session是服务器端使用的一种记录客户端状态的机制,使用上比Cookie简单一些,相应的也增加了服务器的存储压力。

  • 什么是Session
    Session是另一种记录客户状态的机制,不同的是 Cookie保存在客户端浏览器中,而Session保存在服务器上 。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。
    如果说Cookie机制是通过检查客户身上的"通行证"来确定客户身份的话,那么Session机制就是通过检查服务器上的"客户明细表"来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。

  • Session保存信息
    Session对应的类为javax.servlet.http.HttpSession类。每个来访者对应一个Session对象,所有该客户的状态信息都保存在这个Session对象里。Session对象是在客户端第一次请求服务器的时候创建的。Session也是一种key-value的属性对,通过getAttribute(String key)和setAttribute(String key,Object value)方法读写客户状态信息。Servlet里通过request.getSession()方法获取该客户的Session


Session细节

  1. 当客户端关闭后,服务器不关闭,两次Session是否为同一个?
    默认情况下。不是。
    如果需要相同,则可以创建cookie,键为JSESSIONID,设置最大存活时间,让cookie持久化保存。
  2. 客户端不关闭,服务器关闭后,两次获取的Session是同一个么?
    不是同一个,但是要确保数据不丢失。tomcat自动完成以下工作
    * Session的钝化:
    在服务器正常关闭之前,将Session对象序列化到硬盘上
    * Session的活化
    在服务器启动后,将Session文件转化为内存中的Session对象即可。
  3. Session什么时候被销毁?
    1. 服务器关闭
    2. session对象使用invalidate()方法。
    3. Session默认失效时间30分钟

      选择性修改配置属性
      < session-config>
      < session-timeout>30 </ session-timeout>
      < /session-config>

Session的特点

  • Session用于存储一次会话的多次请求的数据,存储在服务器端
  • Session可以存储任意类型,任意大小的数据

Cookie 和Session区别

比较项CookieSession
保持状态保存在浏览器端,服务器端可以知道其中的信息保存在服务器端,客户端不知道其中的信息
使用方式1. 如果不在浏览器中设置过期时间,cookie被保存在内存中,生命周期随浏览器关闭而结束,这种cookie简称为会话cookie
2.如果在浏览器中设置了cookie的过期时间,Cookie被保存在硬盘中,关闭浏览器后Cookie数据依然存在,直到过期时间结束才消失
3.Cookie是在服务器发给客户端的特殊信息,Cookie是以文本形式保存在客户端,每次请求都带上他。
1. 当服务器收到请求需要创建Session对象时,首先会检查客户端请求中是否包含SessionID
- 如果有SessionId,服务器将根据id返回对应的Session对象。
- 如果客户端请求中没有Sessionid,服务器会创建新的session对象,并把sessionid在本次响应中返回给客户端
2. 通常使用Cookie方式存储Sessionid到客户端,在交互浏览器中按照规则将sessionid发送给服务器
3. 如果用户禁止使用cookie,则要使用URL重写,可以通过response.encodeURL(url)进行实现。API对encodeURl的解释为:
- 当浏览器支持cookie时,url不做任何处理
- 当浏览器不支持cookie时,将会重写url将sessionid拼接到访问地址后。
存储内容只能保存字符串类型 ,以文本方式保存保存的是对象(通过与hashtable相似的数据结构来保存),能够支持任何类型的对象(Session中可包含多个对象)
存储的大小单个cookie保存数据不能超过4KbSession大小没有限制
安全性Cookie欺骗、Cookie截获Session的安全性大于Cookie。
原因如下:
1. SessionId存储在cookie中,若要攻破Session必须先攻破Cookie
2.SessionId是要有人登陆,或者启动Session_start才会有,所以攻破cookie也不一定能得到Sessionid
3.第二次启动Session_start后,第一次的sessionID就失效了,session过期后sessionid也随之失效
4. sessionId是加密的
5.综上所述,攻击者必须在短时间内攻破加密的sessionid,这很难。
路径区分cookie中如果设置了路径参数,那么同一个网站中的不同路径 下的cookie是互相访问不到的session不能区分路径,同一个用户在访问一个网站期间,所有的session在任何一个地方都可以访问到
应用场景(1)判断用户是否登录过网站,以便下次登录时能够实现自动登录(或者记住密码)。如果我们删除cookie,则每次登录必须重新填写登录相关信息
(2)保存上次登录时间信息等
(3)保存上次查看的页面
(4)浏览计数
session用于保存每个用户的专用信息,变量的值保存在服务器端,通过sessionID来区分不同的用户。
(1)网上商城的购物车
(2)保存用户登录信息
(3)将某些数据放入session中,供同一用户的不同页面使用
(4) 防止用户非法登录
缺点(1) 大小受限
(2) 用户可以操作(禁用)cookie,使功能受限
(3)安全性较低
(4) 有些状态不可能保存在客户端
(5) 每次访问都要传送cookie给服务器,浪费带宽
(6)Cookie数据有路径(path)的概念,可以限制Cookie只属于某个路径下
(1)Session保存的东西越多,就越占用服务器内存,对于用户在线人数较多的网站。服务器的内存压力会比较大。
(2)依赖于cookie(SessionId保存在cookie中),如果要禁用cookie,则要使用url重写,不安全。
(3)创建Session变量有很大的随意性,可随时调用,不需要开发者做精确的处理,所以,过度使用Session变量将会导致代码不可读且不好维护。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值