一、会话技术
http协议:http协议是一个无状态协议,所谓无状态协议,是指上一次请求和当前请求之间没有任何的联系,所以无法进行数据共享。
会话技术:为了能够让多次请求响应之间可以共享数据,需要提供一门新的技术,这么技术就是会话技术。
所谓会话技术,就是为了实现某一个功能,在浏览器和服务器建立连接之后,发送多次请求和响应之间,在这些请求和响应中共享数据,实现功能目的。直到浏览器关闭之前,发送所有的请求和响应都属于一次会话。
二、Cookie
【1】cookie 的实现原理
在浏览器第一次发送请求的时候,携带一个请求参数,这个参数到达服务器中,会在响应过程中,以set-cookie响应头的形式重新回到浏览器中,并且保留在浏览器中。当发送第二次请求的时候,请求中会自动携带一个cookie请求头,请求头中的数据就是刚刚在浏览器中保留的cookie信息。
【2】Cookie类
创建Cookie类
Cookie cookie = new Cookie(String name,String value);
【3】设置Cookie时间
设置Cookie最大时长
cookie.setMaxAge();
如果不设置最大生命时长,则cookie是一个会话级别的cookie,在浏览器关闭之后,就会立刻销毁。如果设置了最大生命时长,cookie会序列化到磁盘,形成一个文件,这个文件在到达最大生命时长时,会由浏览器自动销毁。
【4】设置Cookie有效路径
设置路径
cookie.setPath(request.getContextPath()+"/");
有效路径是指,在某一个虚拟路径级别之下,可以获取到cookie,无论是静态资源还是动态资源,甚至是404页面,只要是在有效路径下,都可以获取到cookie。如果不设置cookie的有效路径,则cookie只在当前资源的路径级别之下有效。如果设置,则在设置的路径级别之下有效。
【5】删除Cookie
cookie类中没有提供删除cookie的方法,而是通过发送一个与要删除cookie完全一致且生命时长为0的cookie到浏览器,将原有cookie覆盖,这种形式来删除cookie。判断两个cookie完全一致:同name+同path+同domain
【6】Cookie的其他API操作
response.addCookie(Cookie cookie); 发送Cookie
Cookie[] cs = request.getCookies(); 获取Cookie(返回Cookie数组)
cookie.getName(); 获取cookie名称
cookie.getValue(); 获取cookie值
【7】注意
如果向Cookie中设置中文,应注意”500 Control character in cookie value or attribute.“编码错误,Cookie是存放在浏览器端的,是根据net编码规则的,所以,如果要传入中文的话,要按以下规则进行
编码规则:URLEncoder.encode("张三","UTF-8")
Cookie cookie = new Cookie("name", URLEncoder.encode("张三","UTF-8"));
解码规则:URLDecoder.decode(cookie.getValue(),"UTF-8")
String username = URLDecoder.decode(cookie.getValue(),"UTF-8");
三、Session
【1】Session会话技术
由于在浏览器端存储数据安全性较差,所以考虑将数据放入服务器中,提升数据的安全性。将数据存放在服务器中的这门会话技术,就是session会话技术。
【2】Session原理
在浏览器访问服务器后,如果有session对象创建的代码执行,则会在服务器中创建一个session对象,这个session中可以保存当前浏览器的数据,多个浏览器会各自在服务器中保留各自的session对象,这些对象是通过JSESSIONID来区分的。
【2】Session对象的创建不同方式
request.getSession(); 如果当前服务器中没有当前浏览器的session对象,则会立刻创建一个session对象,如果有session对象,则
会直接取出使用。
request.getSession(true); 如果当前服务器中没有当前浏览器的session对象,则会立刻创建一个session对象,如果有session对象,则
会直接取出使用。和第一种方式一样的原理。
request.getSession(false); 如果当前服务器中没有当前浏览器的session对象,会返回null,如果有session对象则会直接取出使用。
【3】Session原理:
session是一个基于cookie工作的对象。本质就是一个cookie。在浏览器中会保留一个名称为JSESSIONID的cookie,用于存储当前session对象的id。
【4】Session特点
session是将数据保留在服务器端,是一门服务器端的技术。由于数据存放在服务中,所以安全性较好。但是只能存储要求保留时间较短的数据。此外,Session是一个域对象。
【5】生命周期
在request.getSession()调用的时候,session对象创建,生命周期开始。
死亡的三种方式
主动:主动调用session.invalidate()方法释放session对象。
被动:在服务器中存有session对象,服务器意外关闭,session对象会被销毁。如果服务器正常关闭,session对象中有仍数据,则这个session对象会被序列化到磁盘上,这个过程称之为钝化,当前服务器下一次重启的时候,会自动读取这个磁盘上的文件,这个过程称之为活化。
超时:如果一个session对象超过30分钟未被使用,会被服务器自动销毁。这个超时时间可以通过web.xml来设置。
以上三种方式都会导致session对象销毁,生命周期结束。
【6】作用范围:整个会话范围。
【7】主要功能:在整个会话范围内共享数据。
四、Session与Cookie区别
Cookie是储存在浏览器端的,Session是存储在服务器端的。
Cookie由于数据存储在浏览器内,所以安全性较低。Session由于数据存储在服务器中,所以安全性较高。
Cookie存储数据的存放时间可以很长。Session存储数据的存放时间不能过长,否则服务器将会压力很大。
Cookie善于安全性要求较低,但是存储时间较长的数据。
Session善于安全性要求较高,但是存储时间较短的数据。