JavaWeb——Cookie和Session(会话技术)

1.会话技术

1.1.概念

会话:一次会话中包含多次请求和响应
一次会话:浏览器第一给服务器资源发送请求,会话建立,直到有一方断开为止
会话的功能:在一次会话的范围内的多次请求间共享数据

1.2.方式

  • 客户端会话技术:Cookie,将来将数据存在客户端
  • 服务器端会话技术:Session,将来将数据存在服务器

2.Cookie

Cookie:客户端会话技术,将数据保存在客户端

2.1.Cookie快速入门

使用步骤:

  • 创建Cookie对象,绑定数据

new Cookie(String name,String value)

  • 发送Cookie对象

response.addCookie(Cookie cookie)

  • 获取Cookie,拿到数据

Cookie[] request.getCookies()

2.2.Cookie实现原理

JavaWeb——Cookie和Session(会话技术)_第1张图片

2.3.Cookie的细节

2.3.1.一次可不可以发送多个Cookie

可以,创建多个Cookie对象,使用response对象的addCookie方法多次发送Cookie即可
JavaWeb——Cookie和Session(会话技术)_第2张图片

2.3.2.Cookie在浏览器中保存多久

  • 默认情况下,当浏览器关闭后,Cookie数据被销毁
  • 设置Cookie声明周期,使他持久化存储

用Cookie对象调用setMaxAge(int seconds)方法

  • 正数:将Cookie数据写到硬盘文件中持久化存储,second表示cookie存活时间,单位是秒
  • 负数:默认值,存在浏览器内存中,浏览器一关闭就销毁Cookie数据
  • 零:删除Cookie数据

2.3.3.Cookie能不能存中文

Tomcat8之前,Cookie中不能直接存储中文数据(需要将中文数据转码——一般采用URL编码),在Tomcat8之后,Cookie支持中文数据。

2.3.4.Cookie共享问题

  • 1.假设在一个Tomcat服务器中部署了多个Web项目,那么在这些项目中Cookie是否共享?
  • 默认情况下Cookie不能共享
  • setPath(String path):设置Cookie的获取范围,默认情况下设置当前项目的虚拟目录,如果要共享,则将path设置为:"/"
  • 2.不同的Tomcat服务器间Cookie共享问题

setDomain(String path):如果设置一级域名相同,那么多个服务器间Cookie共享

2.4.Cookie的特点

  • Cookie存储数据在客户端浏览器
  • 浏览器对于单个Cookie的大小有限制(一般4K左右,和浏览器有关)以及对同一个域名下的总Cookie数量也有限制(一般20个左右,和浏览器有关)

2.5.Cookie的作用

  • Cookie一般用于存储少量的不太敏感的数据
  • 在不登录的情况下完成服务器对客户端的身份识别(主要作用)

3.Session

3.1.概念

Session:服务器端会话技术在一次会话的多次请求间共享数据将数据保存在服务器对象中

3.2.Session快速入门

  • 获取Session对象:HttpSession session = request.getSession();
  • 使用HttpSession对象:
  • Object getAttribute(String name)
  • void setAttribute(String name,Object value)
  • void removeAttribute(String name)

3.3.Session原理分析

服务器如何确保在一次会话范围内多次获取的Session对象是同一个?

第一次获取Session,没有Cookie,会在内存中创建一个新的Session对象,他会有一个唯一的ID,接下来做响应时,会发送响应头:set-cookei:JSESSIONID=唯一的ID,客户端此时将Cookie信息存到浏览器,下次再次访问项目其他资源时通过cookie请求头带过去了JSESSIONID,服务器自动获取cookie信息在根据这个信息查看内存中有没有和JSESSIOID对应的Session对象,如果找到了,getSession方法就找到了这个对象并返回,所以两次的Session是同一个,服务器就是通过Cookie确保一次会话中获取的Session是同一个

3.4.Session的细节

3.4.1.当客户端关闭后,服务器不关闭,两次获取Session是否为同一个

  • 默认情况下不是
  • 如果需要相同,则可以创建Cookie,键为JSESSIONID,设置最大存活时间,让Cookie持久化保存
        //希望客户端关闭后再次获取Session能相同
        Cookie cookie = new Cookie("JSSIONID",session.getId());
        cookie.setMaxAge(60 * 60);
        response.addCookie(cookie);

3.4.2.客户端不关闭,服务器关闭后,两次获取的Session是同一个吗

不是同一个(就是偶然相同也是巧合),但是要确保数据不丢失(session的钝化和活化——Tomcat已经完成了钝化和活化工作)

  • session的钝化:在服务器正常关闭之前,将session对象序列化到硬盘上
  • session的活化:在服务器启动后,将session文件转化(反序列化)为内存中的session对象即可
  • 注意:IDEA可以完成钝化但是无法活化成功,要依靠本地的TomCat服务器去完成钝化和活化,但是实际开发中也不会在IDEA里面部署项目,所以关系不大

3.4.3.Session什么时间被销毁

  • 服务器关闭
  • session对象调用invalidate
  • session默认失效时间是30分钟(可以在配置文件中修改(如下前两张图),也可以在项目中配置(配置内容如下第三个图))
    JavaWeb——Cookie和Session(会话技术)_第3张图片
    JavaWeb——Cookie和Session(会话技术)_第4张图片
    在这里插入图片描述

3.5.Session的特点

  • Session用于存储一次会话的多次请求的数据,存储在服务器端
  • Session可用于存储任意类型、任意大小的数据

4.Session与Cookie区别

Session Cookie
存储位置 服务器端 客户端
大小限制 没有数据大小限制 有限制,与具体浏览器相关
安全性 相对安全 相对不安全

你可能感兴趣的:(Java)