5、会话技术 Cookie&Session

1 会话技术

浏览器第⼀次给服务器资源发送请求,会话建⽴,直到有⼀⽅断开为⽌的过程,称为⼀次会话。

会话技术就是记录这次会话中客户端的状态与数据的。⼀次会话中包含多次请求和响应。
功能:在⼀次会话的范围内的多次请求间,共享数据
	作用:存数据

⽅式:
	客户端会话技术:Cookie
	数据存储在客户端本地,减少服务器端的存储的压⼒,安全性不好,客户端可以清除cookie
	服务器端会话技术:Session
	将数据存储到服务器端,安全性相对好,增加服务器的压⼒。

2 Cookie技术

Cookie技术是将⽤户的数据存储到客户端的技术,我们分为两⽅⾯学习:
	1. 服务器端怎样将⼀个Cookie发送到客户端;
	2. 服务器端怎样接受客户端携带的Cookie。

2.1 快速⼊⻔

cookie:
     1.将数据从服务器存储到客户端
       response.addCookie(cookie): 本质就是添加一个响应头 set-cookie
     2.将数据从客户端获取到 - 客户端会主动将cookie通过请求传输给服务器
       客户端 -> cookie -> 服务器: 本质就是添加一个请求头  cookie
       Cookie[] request.getCookies(): 如果没有cookie返回null

1、 创建Cookie对象,绑定数据

 // new Cookie(String name, String value)
Cookie cookie = new Cookie("username""zhangsan");
  1. 发送Cookie对象
// response.addCookie(Cookie cookie);
response.addCookie(cookie);
  1. 获取Cookie,拿到数据
// Cookie[] request.getCookies()
Cookie[] cookies = request.getCookies();
// 遍历Cookie数组
for(Cookie cookie : cookies){
 String cookieName = cookie.getName();
 String cookieValue = cookie.getValue();
 System.out.println(cookieName + "--" + cookieValue);
}

2.2 cookie的细节

  1.默认的生命周期: 会话结束就删除了(销毁)
      设置生命周期: setMaxAge(int秒)
  2.客户端携带cookie是有条件的, 不是访问所有的网页, 都会将cookie携带过来
    在访问某一些特定网页, 客户端才会主动将cookie携带到服务器, 
    这些特定网页称之为cookie的携带路径
    设置携带路径: setPath()
    默认的携带路径: 当前目录
        /day05/cookie/Demo1Servlet - set-cookie
        /day05/cookie/Demo2Servlet - 可以携带
        /day05/Demo3Servlet - 和Demo1是同一个应用  "/day05"
        /day05/index.jsp
        /day04/Demo1Servlet - 和Demo1是同一个服务器  "/"
  3.什么是相同的cookie:
        cookie的name要一致
        cookie的携带路径要一致
  4.中文支持:
        编码: URLEncoder.encode("张三", "utf-8");
        解码: URLDecoder.decode(value, "utf-8");

2.3 Cookie的特点和作⽤

特点:
	1. cookie存储数据在客户端浏览器
	2. 浏览器对于单个cookie 的⼤⼩有限制(4kb),以及对同⼀个域名下的
	总cookie数量也有限制(20个)
作⽤:
	1. cookie⼀般⽤于存出少量的不太敏感的数据
	2. 在不登录的情况下,完成服务器对客户端的身份识别

3 Session技术

Session技术是将数据存储在服务器端的技术,会为每个客户端都创建
⼀块内存空间存储客户的数据,但客户端需要每次都携带⼀个标识ID
去服务器中寻找属于⾃⼰的内存空间。
所以说Session的实现是基于Cookie,Session需要借助于Cookie
存储客户的唯⼀性标识JSESSIONID。

在Session这我们需要学习如下三个问题:
怎样获得属于本客户端的session对象(内存区域)?
怎样向session中存取数据(session也是⼀个域对象)?
session对象的⽣命周期?

3.1 快速⼊⻔

  1. 获取HttpSession对象:
HttpSession session = request.getSession();

此⽅法会获得专属于当前会话的Session对象,如果服务器端没有该会话的Session对象会创建⼀个新的Session返回,如果已经有了属于该会话的Session直接将已有的Session返回(实质就是根据JSESSIONID判断该客户端是否在服务器上已经存在session了)

2. 使⽤HttpSession对象:
	Object getAttribute(String name)
	void setAttribute(String name, Object value)
	void removeAttribute(String name)

3.2 原理

Session的实现是依赖于Cookie的。

3.3 细节

  1. 当客户端关闭后,服务器不关闭,两次获取session是否为同⼀个?
    默认情况下。不是。
    如果需要相同,则可以创建Cookie,键为JSESSIONID,设置最⼤存活时间,让cookie持久化保存。
// JSESSIONID 持久化
Cookie cookie = new Cookie("JSESSIONID", session.getId());
cookie.setPath(request.getContextPath());
cookie.setMaxAge(100 * 60);
2. 客户端不关闭,服务器关闭后,两次获取的session是同⼀个吗?
	不是同⼀个,但是要确保数据不丢失。tomcat⾃动完成以下⼯作:
	session的钝化
		在服务器正常关闭之前,将session对象序列化到硬盘上
	session的活化
		在服务器启动后,将session⽂件转化为内存中的session对象即可
	
3. session什么时候被销毁?
		服务器关闭
		session对象调⽤invalidate()
		session默认失效时间 30分钟
		选择性配置修改
<session-config>
 <session-timeout>30</session-timeout>
</session-config>

3.4 session的特点

1. session⽤于存储⼀次会话的多次请求的数据,存在服务器端
2. session可以存储任意类型,任意⼤⼩的数据

4 session与Cookie的区别

1. session存储数据在服务器端,Cookie在客户端
2. session没有数据⼤⼩限制,Cookie有
3. session数据安全,Cookie相对于不安全
4. session可以存储任意类型数据,Cookie只能存储字符串类型

5、session总结

session:
  域对象的方法
  获得session: HttpSession session = request.getSession();
    第一次访问服务器, 会创建session对象, 并且生成JSESSIONID编号
    将id编号通过set-cookie发送给客户端保存
    再次访问服务器, 客户端会通过cookie将id编号携带到服务器, 通过id来获
    得session对象
    
    结论: session依赖于cookie技术
         cookie默认生命周期是会话结束就销毁, JSESSIONID就不能保存下去了

  JSESSIONID的持久化: 延长JSESSIONID所在的cookie时间 maxAge
    创建一个一模一样的cookie, 并且设置持久化时间

  生命周期:
    创建: 第一次调用getSession()方法时创建
    销毁: 1.服务器非正常关闭,
           服务器正常关闭时, session中的数据会保存(work/文件) [钝化]
           测试: 使用外部Tomcat测试
         2.session超时, 默认时间30分钟 - web.xml
            <session-config>
                <session-timeout>30</session-timeout>
            </session-config>
         3.手动销毁 session.invalidate()

   域对象:
    ServletContext域的范围: 一次应用
    session域的范围: 一次会话
    Request域的范围: 一次请求

  cookie:  自动登录使用的账号,密码[Filter]; 未登录状态下的购物车信息等
  session: 登录后的用户信息(登录状态); 验证码验证[ajax]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值