文章目录
会话机制
在Web应用中,会话机制是用于跟踪客户状态的普遍解决方案。
HttpSession可以保存跨同一个客户 多个请求的会话状态
- 相同客户,相同servlet,不同请求,不同线程,相同会话
- 不同客户,相同servlet,不同请求,不同线程,不同会话
- 相同客户,不同web应用,不同请求,不同线程,不同会话
- 相同客户,同一个web应用,不同请求,不同线程,相同会话
Cookie对象
Cookie是一种会话技术,它用于将会话过程中的数据保存到用户的浏览器中,从而使浏览器和服务器可以更好地进行数据交互。
服务端向客户端发送Cookie,再响应头字段增加Set-Cookie响应头字段
Set-Cookie:user=itcast;Path=/;
- user:Cookie名称
- itcast:Cookie的值
- Path:Cookie属性
Cookie必须以键值对的形式存在,Cookie一旦创建,名称不能更改,值可以修改。
response对象提供的Cookie操作方法只有一个添加操作 add(Cookie cookie)
Cookie的修改和删除
Cookie不提供修改、删除操作。
- 修改:新建一个同名的Cookie,添加到response中覆盖之前的。
- 删除:新建一个同名的Cookie,并将maxAge设置为0,添加到response中覆盖之前的。
Cookie的有效期
maxAge决定这Cookie的有效期,单位为秒
- maxAge属性为正数:Cookie在maxAge秒后自动消失
- maxAge属性为负数:表示该Cookie仅在本浏览器窗口以及本窗口打开的子窗口有效,关闭窗口后该Cookie即失效。
- maxAge为0:表示删除该Cookie
从客户端读取Cookie时,包括maxAge在内的其他属性都是不可读的,也不会被提交。浏览器提交Cookie时只会提交name与value属性。maxAge属性只被浏览器用来判断Cookie是否过期。
Cookie的生命周期
- 如果没有设置有效期,那么数据不会存在硬盘上,关闭浏览器则cookie消失。
- 如果设置有效期,那么数据会存在硬盘上,即使关闭了浏览器,只要没有过有效期,则该cookie一直存在,等下次打开的时候也会存在。
Cookie的路径
cookie.setPath("/")
表示允许所有路径使用Cookie。path属性需要使用符号“/”结尾
cookie.setPath("/app2/")
表示只有app2应用可以访问此Cookie,其他不行
cookie.setPath("/app1/sub/")
表示只有app1应用下的/sub子路径下的web组件能访问该Cookie
Session对象
- Session是一种将会话数据保存到服务器端的技术。在servletAPI中定义了代表会话的HttpSession接口,存放表示客户状态的信息。
- 容器为每个HttpSession对象分配一个名为JSESSIONID的唯一标识符,Session ID
- Session是借助Cookie技术来传送ID属性的。
会话运作流程(生命周期)
- 服务器向客户端浏览器发送一个名为JSESSIONID表示Session ID的Cookie,容器寻找该Cookie,若不存在则创建一个HttpSession对象,为他分配唯一Session ID,作为Cookies添加到HTTP响应结果中。浏览器将Cookies保存在客户端
- 浏览器进程继续请求访问第一步中的Web应用中任意一个支持会话的网页,在本次HTTP请求中包含表示SessionID的Cookies。所以此次请求已经处于一个会话中了,Servlet容器不再创建新的HttpSession对象,在内存中找到对应的HttpSession对象。
- 浏览器进程重复步骤二,直到当前会话销毁Httpsession对象就会结束生命周
通过重写URL来跟踪会话
- 服务器对客户端进行读写Cookie操作,会给客户端带来安全隐患。所以多数浏览器可以设置是否启动Cookie,当浏览器禁用Cookie时,服务器就无法对客户进行读写Cookie操作。
- Servlet容器可以重写Web组件的URL,把Session ID添加到URL信息中,调用
encodeURL(String url)
重写URL方法 - 用户第一次访问程序时,都会对url地址进行重写。
request获取Session
getSession()
:如果不存在则返回null
getSession(boolean create)
:如果不存在且参数为true,则新建一个,返回新的HttpSession对象
getSession()可能产生发生会话标识号的Cookie头字段,因此必须在发送任何响应内容之前先调用getSession()方法。
session常用方法
void setAttribute(String attribute, Object value)
:设置Session属性。value参数可以为任何Java Object。通常为Java Bean。value信息不宜过大
String getAttribute(String attribute)
:返回Session属性
Enumeration getAttributeNames()
:返回Session存在的属性名
void removeAttribute(String attribute)
:移除Session属性
String getId()
:返回Session的ID。该ID由服务器自动创建,不会重复
void setMaxInactiveInterval(int second)
:设置Session的超时时间。单位为秒
- Tomcat中Session的默认超时时间为20分钟。通过setMaxInactiveInterval(int seconds)修改超时时间。可以修改web.xml改变Session的默认超时时间,参数的单位为分钟。
boolean isNew()
:返回该session是否为新建
void invalidate()
:是该session失效
Servlet容器创建新的会话
- 一个浏览器进程第一次访问Web应用中的支持会话的任意网页
- 当浏览器经常与Web应用的一次会话已经被销毁后,浏览器进程再次访问Web应用中的支持会话的任意一个网页。
Servlet容器销毁会话
- 浏览器进程终止(浏览器突然关闭,Servlet容器端不会立刻知道,因此不会立即结束HTTPSession对象的生命周期,但关闭进程,会话进入不活动状态,等超过时间,就会被销毁)
- 服务器执行HttpSession对象的invalidata()方法
- 会话过期
会话过期的意义
- 及时释放无效HttpSession对象占用内存的空间
- 防止未授权用户访问会话,提供Web应用的安全性。
会话的持久化
持久化:把内存中的HttpSession对象保存到文件系统或数据库中。
好处:
- 节约内存空间,提高对内存资源的利用率
- 确保在服务器重启或单个Web应用重启后,能恢复重启后的会话。
Session监听器示例
- MyData:实现HttpSessionBindingListener和HttpSessionActivationListener接口,并序列化。
- MySessionLifeListener:实现HttpSessionListener和HttpSessionAttributeListener接口。
用HttpSessionListener统计在线用户人数
Cookie和Session区别
- cookie数据存放在客户的浏览器上,临时文件夹中,session数据放在服务器上,一个session域对象为一个用户浏览器服务.
- cookie不会占用服务端内存,存在于客户端内存或cookie文本文件中。
- session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能考虑到减轻服务器性能方面,应当使用cookie。
- cookie是明文传输,安全性低,可以通过一个加密算法进行加密后存放;而session存在于服务端是可靠的。
- 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。(Session对象没有对存储的数据量的限制,其中可以保存更为复杂的数据类型)
- 应用场景:
Cookie:判断用户是否登陆过网站,以便下次登录时能够直接登录。如果我们删除cookie,则每次登录必须从新填写登录的相关信息。
另一个重要的应用是“购物车”中类的处理和设计。用户可能在一段时间内在同一家网站的不同页面选择不同的商品,可以将这些信息都写入cookie,在最后付款时从cookie中提取这些信息,当然这里面有了安全和性能问题需要我们考虑了。
不要保存私人信息。任何重要数据,最好通过加密形式来保存数据(最简单的可以用URLEncode,当然也可以用完善的可逆加密方式,遗憾的是,最好不要用md5来加密)。是否保存登陆信息,需有用户自行选择。长于10K的数据,不要用到Cookies。也不要用Cookies来玩点让客户惊喜的小游戏。
Session:登录等重要信息。
Session是由应用服务器维持的一个服务器端的存储空间,用户在连接服务器时,会由服务器生成一个唯一的SessionID,用该SessionID 为标识符来存取服务器端的Session存储空间。而SessionID这一数据则是保存到客户端,用Cookie保存的,用户提交页面时,会将这一 SessionID提交到服务器端,来存取Session数据。这一过程,是不用开发人员干预的。所以一旦客户端禁用Cookie,那么Session也会失效。
关闭浏览器,再打开新浏览器并发送请求,会生成了一个与关闭浏览器之前不同的新的session对象。当浏览器关闭后,其所占的内存就会是放掉,cookie自然也就被清除了,此时我们不再保存有这个sessionID。所以再打开浏览器访问同一个页面时,由于没有sessionID,也就查不到对应的session对象,此时重新创建一个新的session对象。
都写的很好,可以看看
Cookie和Session的区别
Cookie和Session的生命周期
关闭浏览器session就消失了吗
注意:session很容易失效,用户体验很差;
虽然cookie不安全,但是可以加密 ;
cookie也分为永久和暂时存在的;
Cookie和Session的区别
https://www.cnblogs.com/l199616j/p/11195667.html