目录
- Cookie
- Session
1 会话技术简介
1.1 存储客户端的状态
何为储存客户端状态?例如网站的购物系统,用户将购买的商品信息存储到哪里?因为Http协议是无状态的,也就是说每个客户访问服务器端资源时,服务器并不知道该客户端是谁,所以需要会话技术识别客户端的状态。会话技术是帮助服务器记住客户端状态(区分客户端)
1.2 会话技术
从打开一个浏览器访问某个站点,到关闭这个浏览器的整个过程,成为一次会话。会话技术就是记录这次会话中客户端的状态与数据的。
会话技术分为Cookie和Session:
- Cookie:数据存储在客户端本地,减少服务器端的存储的压力,安全性不好,客户端可以清除cookie
- Session:将数据存储到服务器端,安全性相对好,但要增加服务器的压力
2 Cookie技术
Cookie技术是将用户的数据存储到客户端的技术,我们分为两方面学习:
- 服务器端怎样将一个Cookie发送到客户端
- 服务器端怎样接受客户端携带的Cookie
2.1 服务端发送Cookie
服务端往客户端发送Cookie的步骤:
- 创建Cookie
- 设置Cookie在客户端持久化时间
- 设置Cookie的携带路径
- 向客户端发送该Cookie
2.1.1 创建Cookie
Cookie cookie = new Cookie(String cookieName,String cookieValue);
示例:
注意:cookieValue不能为中文.
2.1.2 设置Cookie持久化时间
cookie.setMaxAge(int seconds); —时间秒
注意:如果不设置持久化时间,cookie会存储在浏览器的内存中,浏览器关闭 cookie信息销毁(会话级别的cookie),如果设置持久化时间,cookie信息会 被持久化到浏览器的磁盘文件里.
示例: 存储时间一周的cookie
设置cookie信息在浏览器的磁盘文件中存储的时间是一周,过期浏览器自动删除该cookie信息.
2.1.3 设置cookie携带路径
cookie.setPath(String path);
注意:如果不设置携带路径,那么该cookie信息会在访问产生该cookie的web资源所在的路径都携带cookie信息
示例:
代表访问javaWeb03应用中的任何资源都携带cookie
代表访问javaWeb03应用中的CookieDemo1时才携带cookie信息
2.1.4 向客户端发送cookie
response.addCookie(Cookie cookie);
示例:
那么该cookie会以响应头的形式发送给客户端.
在浏览器的隐私历史记录中,就能看到该cookie的信息
2.1.5 删除cookie
如果想删除客户端的已经存储的cookie信息,那么就使用同名同路径的持久化时间为0的cookie进行覆盖即可.
再到浏览器查看,cookie已经被删除
2.2 服务器端接收Cookie
2.2.1 通过request对象获取所有Cookie
Cookie[] cookies = request.getCookies();
2.2.2 获取指定名称的Cookie
通过遍历cookies数组,调用getName()方法进行匹配.在遍历之前,最好进行非空校验,避免空指针异常.
3 Session技术
3.1 Session技术简介
Session技术是将数据存储在服务器端的技术,会为每个客户端都创建一块内存空间存储客户的数据,但客户端需要每次都携带一个标识ID(JSESSIONID)去服务器中寻找属于自己的内存空间。所以说Session的实现是基于Cookie,Session需要借助于Cookie存储客户的唯一性标识JSESSIONID
在Session这我们需要解决如下三个问题:
- 怎样获得属于本客户端的session对象(内存区域)?
- 怎样向session中存取数据(session也是一个域对象)?
- session对象的生命周期?
3.2 获取session对象
HttpSession session = request.getSession();
只要在服务器端调用了getSession()方法,服务器端就会往客户端发送一个cookie,名为JSESSIONID.
再次访问,就会带着该cookie,目的就是去寻找属于本客户端的session,即属于本客户端的服务器内存空间.
如果服务器端没有该会话的Session对象会创建一个新的Session返回,如果已经有了属于该会话的Session直接将已有 的Session返回(实质就是根据JSESSIONID判断该客户端是否在服务器上已经存在session了)
3.3 向session对象存取值
Session也是存储数据的区域对象,所以session对象也具有如下三个方法:
- session.setAttribute(String name,Object obj);
- session.getAttribute(String name);
- session.removeAttribute(String name);
但是要注意通过getAttribute()方法拿到的都是Object对象,需要对返回值进行强转.
3.4 session对象的生命周期
3.4.1 session何时被创建?
当服务器第一次执行reques.getSession()的时候.session创建,在服务器内存开辟一块空间给客户端,并生成一个名为JSESSIONID的cookie保存在客户端.
但由于cookie可以被人为的禁止,必须有其它的机制以便在cookie被禁止时仍然能够把session id传递回服务器,经常采用的一种技术叫做URL重写,就是把session id附加在URL路径的后面,附加的方式也有两种,一种是作为URL路径的附加信息,另一种是作为查询字符串附加在URL后面。网络在整个交互过程中始终保持状态,就必须在每个客户端可能请求的路径后面都包含这个session id。
3.4.2 关于URL重写
URL重写,在用户浏览器禁止cookie的情况下,保持用户会话.
首先服务器通过response的encodeURL()及encodeRedirectedURL()方法首先判断 cookies 是否被浏览器支持;如果支持,则参数 URL 被原样返回,session ID 将通过cookies 来维持.
URL重写实际上就是把session ID放在URL里面,一般上如果浏览器开启cookie那么session ID就存放在cookie里面, 但如果cookie被禁用那么session ID就会放在URL里面, 这就是URL重写.
URL重写是保证一个会话操作的方法之一.比如当你登陆localhost:8080/javaWeb03/regist.html表单时进行某些操作,那些URL额外的数据就附加到表示该会话的每个URL上,并且服务器把这个标识符与关于会话所有储存的数据相关联.重写后为
localhost:8080/javaWeb03/regist.html?jsessionid=12345
附加会话信息为jsessionid=12345
即使浏览器不支持cookie或用户禁用cookie时,这种方法也能起作用.
测试
首先禁用浏览器的cookie
访问http://localhost:8080/javaWeb03/set 给session设置属性
因为服务器端没做处理,所以依然会采用之前的方式设置cookie.然后访问http://localhost:8080/javaWeb03/get 获取值.会发现两次sessionId值不同.
3.4.3 session何时被销毁
在以下三种情况下,session被销毁.
- 服务器关闭时
- session过期/失效(默认30分钟)
30分钟,是从不操作服务器端资源开始计时.这个默认的时间可以修改.在web.xml中进行以下配置:
- 服务器端执行session.invalidate()方法
3.4.4 浏览器关闭时session是否被销毁?
不是.关闭浏览器时session对象并没有被销毁.而是客户端的cookie:JSESSIONID被销毁.所以我们再次打开浏览器的时候,再也找不到之前属于我们的那一块空间了.这块空间,也会在服务器关闭,或者我们不操作服务器资源30分钟(默认时间)之后自动销毁.