原文网址:SpringMVC--Session_IT利刃出鞘的博客-CSDN博客
说明
本文介绍SpringMVC中的Session。
官网
cookie和session的区别和联系
cookie是客户端存储数据的,保存在客户端,用户能很容易的获取,安全性不高,存储的数据量小(最大4k)。
session是服务器用来存储部分数据信息,保存在服务器,用户不容易获取,安全性高,储存的数据量相对大,存储在服务器,会占用一些服务器资源,但是对于它的优点来说,这个缺点可以忽略了。
session简介
Session用于保存服务端与客户端“会话”的信息,它保存在服务端。每个客户端会有一个与之关联的Session,服务器会将Session的ID写到客户端的Cookies或者URL。如果客户端禁止Cookies了,服务器会将ID写到URL中。
session的创建
服务器需要为某个客户端的请求创建一个session时,首先检查这客户端请求是否已包含了 session id。
若已包含一个session id则说明以前已经为此客户端创建过session,服务器就按照session id把这个 session检索出来使用。若客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个 session id将被在本次响应中返回给客户端保存。
Session Id的保存
保存这个session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器。一般这个cookie的名字类似于SEEESIONID。比如weblogic对于web应用程序生成的cookie,JSESSIONID= ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764,它的名字就是 JSESSIONID。
URL重写
由于cookie可以被人为的禁止,必须有其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。经常被使用的一种技术叫做URL重写,就是把session id直接附加在URL路径的后面.
附加方式也有两种,一种是作为URL路径的附加信息,表现形式为
http://...../xxx;jsessionid= ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764
另一种是作为查询字符串附加在URL后面,表现形式为
http://...../xxxjsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764
这两种方式对于用户来说是没有区别的,只是服务器在解析的时候处理的方式不同,采用第一种方式也有利于把session id的信息和正常程序参数区分开来。为了在整个交互过程中始终保持状态,就必须在每个客户端可能请求的路径后面都包含这个session id。
Session过期
Session可以设置超时时间。一般默认设置为30分钟或者-1(退出浏览器后失效)。
Session续期
每发出一次请求,Session的到期时间就会更新为当前时间的下一个超时时间段之后。
获得Session
法1:参数注入HttpServletRequest获得session:
public void xxx(HttpServletRequest request, HttpServletResponse response) {
// true:如果不存在 session 会话,则创建一个 session 对象
HttpSession session = request.getSession(true);
}
法2:参数直接注入HttpSession
public void xxx(HttpSession session) {
....
}
Session常用方法
方法 | 返回值 | 说明 |
getId() | String | 返回一个包含分配给该 session 会话的唯一标识符的字符串。 |
getAttribute(String name) | Object | 返回在该 session 会话中具有指定名称的对象,如果没有指定名称的对象,则返回 null |
getAttributeNames() | Enumeration | 返回 String 对象的Enumeration,String 对象包含所有绑定到该 session 会话的对象的名称。 |
removeAttribute(String name) | void | 从该 session 会话移除指定名称的对象。 |
setAttribute(String name, Object value) | void | 使用指定的名称绑定一个对象到该 session 会话 |
getCreationTime() | long | 返回该 session 会话被创建的时间,自格林尼治标准时间 1970 年 1 月 1 日午夜算起,以毫秒为单位。 |
getLastAccessedTime() | long | 返回客户端最后一次发送与该 session 会话相关的请求的时间自格林尼治标准时间 1970 年 1 月 1 日午夜算起,以毫秒为单位。 |
getMaxInactiveInterval() | int | 返回 Servlet 容器在客户端访问时保持 session 会话打开的最大时间间隔,以秒为单位 |
setMaxInactiveInterval(int interval) | void | 在 Servlet 容器指示该 session 会话无效之前,指定客户端请求之间的时间,以秒为单位。 |
invalidate() | void | 指示该 session 会话无效,并解除绑定到它上面的任何对象。 |
isNew() | boolean | 如果客户端还不知道该 session 会话,或者如果客户选择不参入该 session 会话,则该方法返回 true。 |
invalidate()与removeAttribute(String name)区别
invalidate():清除session中的所有内容,并删除session,调用之后再去调用session的其他方法会空指针。不推荐使用
removeAttrite():会将某个属性置为失效
由于不推荐使用invalidate方法,那么退出的操作只能通过removeAttrite方式实现。如果需要统计session,则只能使用HttpSessionBindingListener,可以将登陆信息传入HttpSessionBindingListener的实现类中,然后在绑定解除的方法中,对session进行处理。
注意事项
session有过期时间,
session中可以存放多个属性,同时也可以存放对象 。
如果session设置的属性存在重名,则会替换为新的值。
分布式系列--分布式session--解决方案_分布式_feiying0canglang的博客-CSDN博客