会话技术
因为HTTP协议是无状态的,即服务器不知道用户上一次做了什么,这严重阻碍了交互式Web应用程序的实现。在典型的网上购物场景中,用户浏览了几个页面,买了一盒饼干和两饮料。最后结帐时,由于HTTP的无状态性,不通过额外的手段,服务器并不知道用户到底买了什么。为了做到这点,就需要使用到Cookie了。服务器可以设置或读取Cookies中包含信息,借此维护用户跟服务器会话中的状态。
- 会话: 一次会话中包含多次请求和响应
* 一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止 - 功能: 在一次会话的范围内的多次请求间,各项数据
- 方式:
* 客户端会话技术:cookie
* 服务器端会话技术:session
Cookie
cookie的特性
cookie可以实现跨页面全局变量
cookie可以跨越同域名下的多个网页,但不能跨越多个域名使用
同一个网站中所有页面共享一套cookie
可以设置有效期限
存储空间4-10KB左右
cookie的优点
它的信息是存储在客户端的,每一次向服务器发送请求,cookie都会一起提交。它的优点是响应速度快;缺点就比较明显,它的安全性较低。
cookie机制将信息存储于用户硬盘,因此可以作为跨页面全局变量,这是它最大的一个优点
常用场合:
- 保存用户登录状态;
- 跟踪用户行为;
- 定制页 面;
- 创建购物车 …等等
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 的保存时间
- 默认情况下。当浏览器关闭后,cookie数据被销毁
- 持久化存储:指定cookie存活时间,时间到后,cookie文件自动失效
- Cookie共享问题:
- 假设在一个服务器中部署了多个项目,那么在这些web项目中的cookie在默认情况是不能共享的
可以设置cookie 的path路径来设置cookie的获取范围
- 假设在一个服务器中部署了多个项目,那么在这些web项目中的cookie在默认情况是不能共享的
Session
Session原理
session 原理以及生命周期
- :session 是通过浏览器的cookie来保存一个jessionid的信息 。这个jsessionid里面包含着你session 的id 。正是通过这个jessionid浏览器才能判断是不同用户的session ,用户每次进行session.getAttribute()或则 session.setAttribute时候。都会取出jesseionid里面的信息和session id比较。来区分不通的session。
- session 的生命周期是一次会话。就是从用户开始请求这个application开始到application结束。 你停止了服务当然这个应用也就结束。tomcate容器出清除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细节
- 当客户端关闭后,服务器不关闭,两次Session是否为同一个?
默认情况下。不是。
如果需要相同,则可以创建cookie,键为JSESSIONID,设置最大存活时间,让cookie持久化保存。 - 客户端不关闭,服务器关闭后,两次获取的Session是同一个么?
不是同一个,但是要确保数据不丢失。tomcat自动完成以下工作
* Session的钝化:
在服务器正常关闭之前,将Session对象序列化到硬盘上
* Session的活化
在服务器启动后,将Session文件转化为内存中的Session对象即可。 - Session什么时候被销毁?
- 服务器关闭
- session对象使用invalidate()方法。
- Session默认失效时间30分钟
选择性修改配置属性
< session-config>
< session-timeout>30 </ session-timeout>
< /session-config>
Session的特点
- Session用于存储一次会话的多次请求的数据,存储在服务器端
- Session可以存储任意类型,任意大小的数据
Cookie 和Session区别
比较项 | Cookie | Session |
---|---|---|
保持状态 | 保存在浏览器端,服务器端可以知道其中的信息 | 保存在服务器端,客户端不知道其中的信息 |
使用方式 | 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保存数据不能超过4Kb | Session大小没有限制 |
安全性 | 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变量将会导致代码不可读且不好维护。 |