什么是会话
用户打开浏览器,访问站点服务器,连续操作(连续的访问站点服务器web资源),直到关闭浏览器,这个整个过程就叫做会话。
会话过程中要解决的问题
每个用户与服务器进行交互的过程中,各自会有一些数据,程序要想办法保存每个用户的数据。
会话技术的由来
由于HTTP协议无状态的(是指服务器是不知道客户端的状态的,就好比客户1访问服务器,客户2访问服务器,服务器是不知道谁是客户1谁是客户2的。换句话说,客户1上次请求的数据,服务器是不会保存的)由此而引发了会话技术,也就是说,会话技术的出现,就是为了让服务器管理客户端的状态。
会话技术分为两种
cookie
cookie是客户端技术,当客户端与服务器每进行一次通讯的时候,服务器都会客户端写回一个ID标识,这个标识会以cookie的形式保存至客户端浏览器,当客户端下次再访问服务器的时候,客户端会向服务器发送cookie,会根据cookie中的ID标识去服务器的session池中查找对应的session。
cookie原理
采用cookie作为会话技术(用cookie保存用户状态信息)
如果采用cookie作为会话技术,那么它的工作原理就如上,比如我访问淘宝,第一次请求,买个电视机,服务器经过处理,将"电视机"响应给我的客户端,这时我的客户端浏览器的缓存或者相关的硬盘中保存了"电视机"的信息,当下次我再向淘宝网发送买手机的请求时,同理,服务器会响应给我"手机"的信息,这时我的客户端cookie中保存了"电视机、手机"信息,当我点击结账的时候,会再一次携带着cookie信息访问服务器,服务器获取cookie信息,并对其进行结账处理。
cookie案例
cookieAPI
cookie写回客户端 response.addCookie(cookie)
获取cookie信息,request.getCookies
cookie对象创建new Cookie(name,value)
cookie的name不允许改变--用getName、getValue、setValue但是没有setName
setMaxAge与getMaxAge
setDomain与getDomain
setPath与getPath
通过setMaxAge设置Cookie为持久Cookie
cookie.setMaxAge(60*60*24)设置cookie的时间为1天
访问cookie的有效路径path
默认情况下,生成cookie时,产生默认有效访问路径(默认生成cookie的路径)
例如:
http://localhost/zhangpeng/servlet/path 生成cookie path默认值为/zhangpeng/servlet
http://localhost/zhangpeng/path 生成cookie path默认值为/zhangpeng
第二次访问程序携带cookie信息,如果访问路径与path不一致,不会携带cookie
shop cookie:path zhangpeng/servlet
buycat cookie:path zhangpeng
访问:http://localhost/zhangpeng/servlet/path 同时满足/zhangpeng/servlet、/zhangpeng携带shop和buycat两个cookie信息
访问:http://localhost/zhangpeng/path 满足/zhangpeng 不满足/zhangpeng/servlet 只携带buycat信息
所以,以后的程序开发,尽量设置cookie的path
什么是会话cookie,什么是持久cookie
cookie信息默认情况下,保存在浏览器内存中的,这个cookie就叫会话cookie
特点:会话cookie在关闭浏览器时清除
cookie信息保存在客户端硬盘上叫持久cookie。
特点:永久保存在本地硬盘上。
删除cookie
会话cookie,关闭浏览器即可删除
持久cookie,必须把setMaxAge设置为0
同时必须设置path,与生成cookie的path一致!
Cookie cookie=new Cookie("zp","zhangpeng");
cookie.setMaxAge(0); //默认path的情况下,不用设置path
这样就会删除"zp"这个cookie
窍门:在javaAPI中所有与时间相关的参数,如果是int类型 单位是秒 long类型 单位是毫秒
cookie案例
商品浏览记录
MX3
MX4
小米3
note3
清空浏览记录
即删除cookie,设置setMaxAge(0) 设置path
session
session是服务端的技术,客户端访问服务器的时候,服务器会保存客户端的状态信息,并向客户端发送一个ID标识,这个客户端的状态信息实际上就是保存在session中,但是这个session是从服务器的session池中获得的,每一个session在session池中都有一个唯一的ID标识,当客户端下次再访问服务器的时候,客户端会向服务器发送这个ID标识,服务器会通过这个ID标识找到相应的session,并从session中获取用户的状态信息。
session的工作原理
cookie与session的区别
cookie信息存在客户端,存在安全问题。session将数据存在服务器端,数据更加安全。
session将信息保存在服务器端,占用服务器资源。cookie不会占用服务器资源。
session共享
实验:用IE6 cookie向session保存一个数据,用另一个IE6读取
用第一个IE6保存session数据时,当前浏览器可以获得。但是第二个IE6无法获取第一个浏览器保存session数据。
IE8以上或火狐浏览器,当打开多个浏览器窗口,它们之间的session却共享。
原因:IE6 中的cookie默认是会话cookie。IE8默认是持久cookie。
问题:如何让多个IE6共享同一个session
解决:将JsessionID持久化。
问题:如果客户端关闭浏览器,是否就删除了session呢?
答案肯定不是,session是保存在服务器端的,IE6造成的假象是因为客户端cookie是会话cookie的缘故。
如果用户禁用了cookie,session该如何使用?
如果禁用了cookie,sessionID将不能缓存至cookie中。解决cookie禁用问题:URL重写。
例如:http://localhost:8080/zp/read;JSESSIONID=tfgddv717272gs7fs77v
有两种方式可完成url重写:
①.response.encodeRedirectURL(url);
②.response.encodeURL(url) 重点用第二个 url=response.encodeURL(url);
sessiob失效:可在web.xml配置session失效时间。
session.setMaxInactiveInterval(60*60); 秒
生命周期:何时创建,何时销毁
cookie生命周期
创建:Cookie cookie=new Cookie(name,value); response.addCookie(cookie);
销毁:会话cookie会在浏览器关闭时销毁。持久cookie会在cookie过期(MaxAge)后销毁
session生命周期
创建:request.getSession();
销毁:三种 1.服务器关闭 2.session过期 3.session.invalidate()
session实现一次性验证码
CheckCodeServlet 每次加载登录界面生成验证码,并存入session
LoginServlet登录,获取验证码 判断验证码是否输入正确
servlet三种数据范围
ServletContext
HttpServletRequest
HttpSession