Session与Cookie
前段时间一个测试的同事问我一个问题,说Session、Cookie、Token都是干啥的。今天中午详细总结下这些概念和用法。
一、Session
Session概念:
Session用于跟踪客户的状态,Session是指在一段时间内,单个客户与WEB服务器一连串相关的交互过程。在一个Session中,客户可能多次请求访问同一个网页,也有可能请求访问各种不同的服务器资源。
Session运行机制:
当一个Session开始时,Servlet容器将创建一个HttpSession对象,在HttpSession对象中可以存放客户的状态信息(例如购物车)。
Servlet容器为HttpSession分配一个唯一标志符,称为SessionID。Servlet容器将SessionID作为Cookie保存在客户的浏览器中( tomcat生成的sessionid叫做jsessionid)。
每次客户发送Http请求时,Servlet容器可以从HttpServletRequest对象中读取SessionID,然后根据SessionID找到对应的HttpSession对象,从而获取客户的状态信息。
Session用于跟踪客户的状态,Session是指在一段时间内,单个客户与WEB服务器一连串相关的交互过程。在一个Session中,客户可能多次请求访问同一个网页,也有可能请求访问各种不同的服务器资源。
Session运行机制:
当一个Session开始时,Servlet容器将创建一个HttpSession对象,在HttpSession对象中可以存放客户的状态信息(例如购物车)。
Servlet容器为HttpSession分配一个唯一标志符,称为SessionID。Servlet容器将SessionID作为Cookie保存在客户的浏览器中( tomcat生成的sessionid叫做jsessionid)。
每次客户发送Http请求时,Servlet容器可以从HttpServletRequest对象中读取SessionID,然后根据SessionID找到对应的HttpSession对象,从而获取客户的状态信息。
Session的生命周期:
当客户第一次访问WEB应用中支持Session的某个页面时,就会开始一个新的session
接下来客户访问这个WEB应用中不同的网页时,都处于同一个session中
默认情况下,JSP页面是支持Session的,如果想不支持Session,可使用标签<%@ page session="false"%>
在下列情况下,Session将结束生命周期,Servlet容器将释放HttpSession占用的资源:
1,客户浏览器关闭?
2,Session过期
3,服务器端调用了HttpSession的Invalidate()方法
如何做到在浏览器关闭时删除Session?
严格的讲,做不到这一点。可以做的努力的办法是在所有的客户端页面里使用javascript的方法window.onclose来监视浏览器的关闭动作,然后向服务器发送一个请求来删除Session;
但是对于浏览器崩溃或强行杀死进程这种非常规手段仍然无能为力。
实际上我们在项目中也不会这么做,而是让服务器在Session过期时将其删除。
session一般存放在服务器端的内存中。不过session可以通过特殊的方式做持久化管理(memcache,redis)
当客户第一次访问WEB应用中支持Session的某个页面时,就会开始一个新的session
接下来客户访问这个WEB应用中不同的网页时,都处于同一个session中
默认情况下,JSP页面是支持Session的,如果想不支持Session,可使用标签<%@ page session="false"%>
在下列情况下,Session将结束生命周期,Servlet容器将释放HttpSession占用的资源:
1,客户浏览器关闭?
2,Session过期
3,服务器端调用了HttpSession的Invalidate()方法
如何做到在浏览器关闭时删除Session?
严格的讲,做不到这一点。可以做的努力的办法是在所有的客户端页面里使用javascript的方法window.onclose来监视浏览器的关闭动作,然后向服务器发送一个请求来删除Session;
但是对于浏览器崩溃或强行杀死进程这种非常规手段仍然无能为力。
实际上我们在项目中也不会这么做,而是让服务器在Session过期时将其删除。
session一般存放在服务器端的内存中。不过session可以通过特殊的方式做持久化管理(memcache,redis)
HttpSession接口
getCreationTime() 返回创建时间
getId() 返回SessionId
getLastAccessedTime() 返回最后访问时间
setMaxInactiveInterval() 设置session的最大有效时间 单位为秒 如果设置为负数,表示不限制session处于不活动状态的最大有效时间,默认的设置时间为30分钟
invalidate() 让当前session失效,Servlet容器会释放HttpSession对象占用的资源
二、Cookie
Cookie概念:
Cookie是由服务器端生成,发送给User-Agent(一般是浏览器),浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给服务器(前提是浏览器设置为启用cookie)。Cookie名称和值可以由服务器端开发自己定义,对于JSP而言也可以直接写入JSESSIONID用于标记一个会话(session),这样服务器可以知道该用户是否合法用户以及是否需要重新登录等,服务器可以设置或读取Cookies中包含信息,借此维护用户跟服务器会话中的状态。
Cookie类的属性:
name 名称
value 值
comment 说明
domain 站点域名
maxAge 存活时间
path 路径
secure 当设置为true时,表示创建的 Cookie 会被以安全的形式向服务器传输,也就是只能在 HTTPS 连接中被浏览器传递到服务器端进行会话验证,如果是 HTTP 连接则不会传递该信息,所以不会被窃取到Cookie 的具体内容。
version 版本
isHttpOnly 如果在Cookie中设置了"HttpOnly"属性,那么通过程序(js脚本、Applet等)将无法读取到Cookie信息,这样能有效的防止XSS攻击。
value 值
comment 说明
domain 站点域名
maxAge 存活时间
path 路径
secure 当设置为true时,表示创建的 Cookie 会被以安全的形式向服务器传输,也就是只能在 HTTPS 连接中被浏览器传递到服务器端进行会话验证,如果是 HTTP 连接则不会传递该信息,所以不会被窃取到Cookie 的具体内容。
version 版本
isHttpOnly 如果在Cookie中设置了"HttpOnly"属性,那么通过程序(js脚本、Applet等)将无法读取到Cookie信息,这样能有效的防止XSS攻击。
在Java代码中获取Cookie的maxAge属性遇到的问题
Cookie从服务器端发送到客户端时,信息是完整的;
Cookie从客户器端发送到服务端时,信息只剩下key、value了。
Cookie从客户器端发送到服务端时,信息只剩下key、value了。
三、Session与Cookie的区别和应用
1,Cookie是客户端技术(存储在客户浏览器中),而HttpSession是服务器端技术(应用服务器中)。2,session 的运行依赖 SessionId,而SessionId 是存在 cookie 中的,也就是说,如果浏览器禁用了 cookie ,同时 session 也会失效(但是可以通过其它方式实现,比如在 url 中传递SessionId)
3,Cookie 应用 如 记住登录功能,购物车功能。 Session 权限功能实现,用户敏感信息等。
备注:Servlet/Jsp 实现登录功能和记住我功能。源码地址 https://git.oschina.net/68gkb/servlet-jsppro