携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第12天,点击查看活动详情 >>
会话技术
-
会话:一次会话中包含多次请求和响应;一次会话是指浏览器第一次向服务器发起请求,会话建立,直到有一方断开为止;
-
功能:再一次会话的范围内的多次请求间共享数据;
-
方式:
- Cookie:客户端(浏览器)会话技术;
- Session:服务器端会话技术;
Cookie
概念:客户端会话技术,将数据保存在客户端。
实现原理:基于响应头set-cookie(发送) 和 请求头cookie实现(接收);
使用步骤:
- 创建cookie对象,绑定数据
Cookie cookie = new Cookie(String name, String value);
- 发送Cookie对象,在响应头中的set-cookie字段中;
response.addCookie(cookie);
- 获取Cookie,拿到Cookie,在下一次请求请求头的cookie字段中;
Cookie[] cookies = request.getCookies();//数组
细节:
-
一次可不可以发送多个cookie?
- 可以,创建多个cookie对象,多次调用addCookie方法;
-
cookie在浏览器中保存多长时间?
-
默认情况下,当浏览器关闭后,cookie数据被销毁;
-
持久化存储,设置有效期:
cookie.setMaxAge(int seconds);参数为正数表示持久化到硬盘并设置cookie存活时间,单位秒;负数为默认值;0代表删除cookie信息;
-
-
cookie能不能存中文?
- tomcat8 之前不能直接存储中文数据,tomcat8之后支持中文数据;
- tomcat8之前对中文要进行URL编码存储,URL解码解析;
- tomcat8对特殊字符如空格等也不支持,要进行URL编码存储;
-
cookie共享问题?
-
在同一个tomcat服务器下的多个web项目不可以共享cookie;
-
可以通过设置有效路径:
cookie.setPath(String uri);设置cookie的获取范围。默认情况下为当前项目的虚拟目录; -
如果要在同一服务器内多个web项目共享,可以把path设置为"/",表示服务器内部共享;
-
如果要在不同服务器间进行cookie共享,可以设置域名setDomain(String path):如果设置一级域名相同,那么多个服务器之间的cookie可以共享;
- setDomain(".baidu.com"),那么tieba.baidu.com和news.baidu.com之间的cookie可以共享;
-
特点:
- cookie存储在客户端浏览器;
- 浏览器对于单个cookie的大小有限制,以及对同一个域名下的总数量也有限制;
作用:
- cookie一般用于存储少量的不太敏感的数据;
- 在不登录的情况下,完成服务器对客户端的身份识别;
Session
概念:服务器会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中,属于HttpSession类型;
实现原理:session的实现是依赖于cookie的;
Session也是一个域对象,与Request、ServletContext相似,也有域对象同样的方法:
Object getAttribute(String name);void setAttribute(String name, Object value);void removeAttribute(String name);
使用步骤:
-
创建/获取session对象;
- 如果请求中拥有session的标识符也就是JSSESIONID,则返回其对应的session对象
- 如果请求中没有JSSESIONID,则创建新的session对象,并将其JSSESIONID作为cookie对象存储到浏览器的运行内存中
- 如果session对象失效了,也会创建一个session对象,并将其JSESSION对象存储到浏览器的运行内存中
HttpSession session = request.getSession();
- 存储数据
session.setAttribute(String name, Object value);
- 获取数据
Object value = session.getAtrribute(String name);
注意:存储数据的动作和获取数据的动作发生在不同的请求中,但是存储要先于取出执行;
细节:
-
客户端关闭后,服务器不关闭,两次获取的session是否为同一个?
默认情况下,不是。默认情况下,浏览器关闭后,cookie即失效,session也就失效了,除非提前创建cookie并设置最大存活时间,让cookie持久化保存,在设置时间范围内,获取的session为同一个。
Cookie c = new Cookie("JSESSIONID", session.getId()); c.setMaxAge(60*60); response.addCookie(c);//此时1小时内,获取的session为同一个; -
客户端不关闭,服务器关闭后,两次获取的session是否为同一个?
不是。但是要确保数据不丢失。Tomcat服务器自动实现钝化和活化;
- session的钝化:在服务器正常关闭之前,将session对象序列化到硬盘上;
- session的活化:在服务器启动后,将session文件转化为内存中的session对象;
-
session什么时候被销毁?
-
服务器关闭;
-
session对象调用invalidate()
session.invalidate();; -
默认失效时间为30分钟;
可以在web.xml中配置session-config设置默认失效时间。
也可以设置:
hs.setMaxInactiveInterval(int seconds);
-
特点:
- session用于存储一次会话的多次请求的数据,存在服务器端
- session可以存储任意类型,任意大小的数据
- 依赖cookie技术,生命周期为一次回话,默认存储时间是30分钟
- session对象的唯一标识JSESSIONID同过cookie技术作为一个cookie数据存储到浏览器的运行内存中
与cookie的区别:
- session存储数据在服务器端,cookie在客户端;
- session没有数据大小限制,cookie有;
- session数据安全(在服务器端),cookie相对不安全;
总结:
- 总结:session解决了一个用户的不同请求的数据共享问题,只要在JSESSIONID不失效和session对象不失效的情况下,用户的任意请求在处理时都能获取到同一个session对象
- 注意:JSESSIONID存储在了cookie的临时存储空间中,浏览器关闭即失效;