servlet会话技术 cookie和session

会话机制

在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属性的

会话运作流程(生命周期)

  1. 服务器向客户端浏览器发送一个名为JSESSIONID表示Session ID的Cookie,容器寻找该Cookie,若不存在则创建一个HttpSession对象,为他分配唯一Session ID,作为Cookies添加到HTTP响应结果中。浏览器将Cookies保存在客户端
  2. 浏览器进程继续请求访问第一步中的Web应用中任意一个支持会话的网页,在本次HTTP请求中包含表示SessionID的Cookies。所以此次请求已经处于一个会话中了,Servlet容器不再创建新的HttpSession对象,在内存中找到对应的HttpSession对象。
  3. 浏览器进程重复步骤二,直到当前会话销毁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


版权声明:本文为weixin_44847031原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。