一.会话技术
会话:会话指的是多次请求和多次响应,客户端在第一次给服务器发送请求时会话建立,直到一方断开为止。
功能:可以在多个请求之间共享数据。
方式:客户端会话技术(cookie)和服务器端会话技术(session)
二.客户端会话技术
客户端会话技术采用cookie实现:
先直接使用,然后讲解原理,使用步骤如下:
(1).创建cookie对象:Cookie cookie = new Cookie(“msg”, “cookieInfo”);
(2).发送cookie:response.addCookie(cookie);
(3).获取cookie: request.getCookies();
1.添加cookie
@RequestMapping("/addCookie")
public String testAddCookie(HttpServletRequest request, HttpServletResponse response){
Cookie cookie = new Cookie("msg", "cookieInfo");
response.addCookie(cookie);
return "Cookie added successfully";
}
启动项目,浏览器打开network访问该url,在响应头处可看到添加的cookie信息
2.获取cookie
@RequestMapping("/getCookie")
public String testGetCookie(HttpServletRequest request, HttpServletResponse response){
Cookie[] cookies = request.getCookies();
if (cookies != null){
for (Cookie cookie : cookies) {
String name = cookie.getName();
String value = cookie.getValue();
System.out.println("cookie键:"+name);
System.out.println("cookie值:"+value);
}
}
return "Cookie obtained successfully";
}
可以看到控制台打印了刚才添加的cookie信息
3.原理
客户端请求/addCookie时会话建立,这里我们设置了cookie的值,然后通过response将cookie发送到客户端浏览器。在浏览器未关闭的情况下,也就是此次会话还未结束(服务器不做任何设置默认浏览器关闭则此次会话关闭),再请求/getCookie时,客户端会将刚才的cookie信息通过放在请求头一并发送到服务器,服务器通过request.getCookies()即可获取浏览器发送过来的cookie。下图是第二次请求的请求头,可以看到浏览器在请求头中将该域名(也就是localhost)的该会话下的所有cookie发送到服务器。
4.cookie使用的注意事项
(1)浏览器对每个cookie的大小都有限制,基本在几kb左右,而且浏览器对每个域名下的cookie数量也做了限制,20个左右。再个cookie存放在浏览器端,这种方式不安全。所以可以使用cookie存放容量小且对安全要求不高的数据。
(2)默认情况下浏览器关闭,会话结束,cookie也会销毁。可以使用setMaxAge(int seconds)这个方法设置cookie的存活时间,做此设置浏览器会将cookie持久化到磁盘,到了过期时间会自动删除cookie信息。
三.服务器端会话技术
服务器端会话技术采用session实现
这里同样直接使用,然后讲解原理,使用步骤如下。
(1)获取HttpSession对象:HttpSession session = request.getSession();
(2)设置session的值:session.setArrtibute(“msg”, “sessionInfo”);
(3)获取session的值:session.getAttribute(“msg”);
1.设置session
@RequestMapping("/setSession")
public String testSetSession(HttpServletRequest request, HttpServletResponse response){
HttpSession session = request.getSession();
session.setAttribute("msg", "sessionInfo");
return "Session setting successfully";
}
2.获取session
@RequestMapping("/getSession")
public String testGetSession(HttpServletRequest request, HttpServletResponse response){
HttpSession session = request.getSession();
Object value = session.getAttribute("msg");
System.out.println("session值:"+value);
return "Session obtained successfully";
}
获取session可以看到控制台打印了刚才设置的session信息
3.原理
分别打开两次请求的network,首先看/setSession这次请求
然后看/getSession的请求
在客户端第一次请求时/setSession,我们创建了一个Httpsession对象,并且设置了session的信息,我们在该请求中并未手动创建cookie且发送到浏览器,但是network的信息的响应头中为什么会有cookie的信息(键是JSESSIONID),原因是session是依赖于cookie的,当请求到达服务器时,我们设置好了session信息,此时即使我们我们有手动创建cookie,服务器也会自动创建cookie对象,将JSESSIOND当作键,session的id当作值,session的id可以通过getId()获取,然后通过response将cookie发送到客户端浏览器。所以在/setSession的响应头处会有cookie的信息,这个cookie保存的就是session的id值。当客户端第二次请求/getSession时,请求会将该域名的该会话下的所有cookie信息放到请求头发送到服务器,第二张图箭头处所指,这点在cookie的原理讲解也说过。请求到达服务器,服务器会自动获取发送过来的cookie信息,拿到session的id和我们要获取的session的id做比较,如果二者相等,则我们可以通过session.getAttribute(“msg”)拿到session的信息。
4.session使用的注意事项
session将数据存放在服务器端,对数据的大小无限制,由于存在服务器端,数据相对浏览器会很安全。但是数据存在服务器的内存上,所以也要注意session的大小,避免过多的session存放在服务器造成过大的内存开销。