Cookie与Session
1. Servlet后续详解
1.1 一个Servlet可以有多个 <url-pattern>
1.2 配置Servlet可以使用通配符(*)
*:表示任意字符
A. /*:可以使用任意的字符访问当前的Servlet
B. /xxx/*:xxx表示某一个模块,一般用于权限验证
C. *.action,*.do等等
1.3 自定义的<servlet-name>
注意这个内容不能为default
1.4 自定义启动Servlet启动时刻
在执行Servlet的初始化操作的时候,如果初始化的处理工作比较复杂,那么第一个请求的用户的体验会非常差,那么可以设置Servlet执行初始化的时刻为服务器启动的时候
1 | <servlet> |
2. HTTP协议无状态问题
2.1 什么是会话
会话就是在打开浏览器后和服务器可以进行多次交流,即请求与响应
注意:在一次会话中可以有多次请求和多次接受响应
2.2 无状态
HTTP是无状态协议,也就是没有记忆力,每次请求之间无法共享数据。这就无法知道会话什么时候结束,什么时候开始,也无法确定发出请求的用户身份。
出现的问题:请求之间无法实现数据的共享
2.3 会话跟踪技术
一个会话中共享数据就是会话跟踪技术。
2.4 无状态问题解决方案
A. 使用参数拼接在请求的URL后面,实现数据的传递
问题:可以解决数据共享的问题,但是这种方式会将参数暴露在地址栏中,不安全
B. Cookie
C. Session
3. Cookie
3.1 Cookie是什么?
Cookie:小甜点
特点:客户端的技术,将共享数据保存在客户端(即浏览器)中
在第一次请求的时候,将共享数据发送到浏览器中进行保存,以后每次请求都将之前保存的共享数据发送到到服务器。
3.2 Cookie的解释
![image_1cb61m8u313dp1ipq172mbqb1vpsp.png-29.9kB][1]
1 | //创建一个Cookie,类似于办卡 |
第一次请求
![无标题.png-109.2kB][2]
非第一次请求
![无标题.png-104.4kB][3]
### 3.3 Cookie的操作细节
![image_1cfn8nm3e13e1d8ubf47kl1rl59.png-90.4kB][4]
3.3.1 创建Cookie对象,设置共享数据
1 | Cookie c = new Cookie(String name,String value); |
3.3.2 将Cookie响应给刘篮球
1 | response对象.addCookie(c); |
3.3.3 获取请求中的Cookie信息
1 | Cookie[] cs = request对象.getCookies(); |
3.3.4 修改Cookie中的共享数据
A. 重新创建一个新的cookie,名称和要修改的数据的Cookie的名称一样
B. 先获取到要修改的cookie对象,再调用setValue(String newValue)重新设置值
注意:修改Cookie中的数据,需要再次发送给浏览器
3.3.5 操作Cookie的生命周期
1 | //默认是在关闭浏览器的时候销毁 |
expiry>0:设置Cookie能够存活expiry秒,即使关闭浏览器,不影响Cookie中的共享数据。比如:十天内免登录:setMaxAge(60*60*24*10)
expiry=0:立即删除当前的Cookie信息
expiry<0:缺省值,关闭浏览器的时候销毁
![image_1cb63umlp1rap1arv1sib4umj4t2b.png-40.8kB][5]
3.3.6 删除Cookie中的共享数据
1 | setMaxAge(0); |
3.3.7 Cookie中的key和value不支持中文
1 | //设置编码 |
3.3.7 Cookie的作用范围
Cookie在创建的时候会根据当前的Servlet的相对路径设置自己的路径,比如当前Servlet的路径为/login/loginServlet,则相对路径为/login/,那么只有在访问/login/下面的资源的时候,才能够将该Cookie发送到服务器。
1 | //设置Cookie的路径 |
多个项目之间共享数据,则需要设置域范围,比如:
wenku.baidu.com
pan.baidu.com
Cookie对象.setDomain(“baidu.com”);
3.4 Cookie的作用与缺陷
3.4.1 作用是实现会话跟踪
3.4.2 Cookie的缺陷
1. 获取Cookie信息很麻烦
2. Cookie不支持中文
3. 一个Cookie只能存储一个字符串类型的数据
4. Cookie在浏览器中有数量的限制
一个浏览器对一个站点最多存储20条Cookie信息
一个浏览器最多只能存储300个Cookie
5. 共享数据是保存在浏览器中的,很容易造成数据的泄露(不安全)
4. Session
4.1 Session是什么
Session是服务端的会话技术,是将数据保存在服务端。其实底层就是Cookie。
4.2 Session的操作
4.2.1 获取Session对象
1 | request对象.getSession():和参数为true的一样 |
4.2.2 设置共享数据
Session对象.setAttribute(String name,Object value)
Session可以存储任何类型的数据,比如登录用户的信息,可以封装到User对象中。
4.2.3 修改Session中的共享数据
重新设置一个同名的共享数据即可
4.2.4 获取共享数据
Object value = Session对象.getAttribute(String name);
4.2.5 删除Session中的共享数据
Session对象.removeAttribute(String name);
4.2.6 销毁Session
Session对象.invalidate()
4.2.7 Session的命名规范
Session中共享数据的属性名的命名规范:XXX_IN_SESSION
Session对象.setAttribute("USER_IN_SESSION",user)
4.2.8 Session中的序列化与反序列化
Session中存储的对象通常需要实现序列化接口
在网络之间传输的数据格式为二进制数据
序列化:将对象转换成二进制数据
反序列化:将二进制数据转换成对象
4.2.9 Session的超时管理
超时:在访问当前的资源的过程中,不和网页进行任何交互,超过设定的时间就是超时
1 | setMaxInactiveInterval(int interval) |
在服务器中默认的配置为30分钟,通常不需要修改。
5. Cookie与Session的区别
- Cookie中只能保存ASCII字符串,Session中可以保存任意类型的数据,甚至Java Bean乃至任何Java类、对象等
- 隐私策略不同。Cookie存储在客户端,对客户端是可见的,可被客户端窥探、复制、修改。而Session存储在服务器上,不存在敏感信息泄露的风险
- 有效期不同。Cookie的过期时间可以被设置很长。Session依赖于名为JSESSIONI的Cookie,其过期时间默认为-1,只要关闭了浏览器窗口,该Session就会过期,因此Session不能完成信息永久有效。如果Session的超时时间过长,服务器累计的Session就会越多,越容易导致内存溢出。
- 服务器压力不同。每个用户都会产生一个session,如果并发访问的用户过多,就会产生非常多的session,耗费大量的内存。因此,诸如Google、Baidu这样的网站,不太可能运用Session来追踪客户会话。
- 浏览器支持不同。Cookie运行在浏览器端,若浏览器不支持Cookie,需要运用Session和URL地址重写。
- 跨域支持不同。Cookie支持跨域访问(设置domain属性实现跨子域),Session不支持跨域访问