【JavaWeb学习】01会话技术(java)

一、会话跟踪

1.会话是什么

概述:

用户打开浏览器,访问web服务器的资源,会话建立,直到有一方(客户端/服务器)断开连接,会话结束。

就相当于打电话,如果接通了,会话就建立了,双方就可以对话了。如果任意一方挂断电话,会话就结束了。

  • 从浏览器发出请求到服务端响应数据给前端之后,一次会话(在浏览器和服务器之间)就被建立了

  • 会话被建立后,如果浏览器或服务端都没有被关闭,则会话就会持续建立着

  • 浏览器和服务器就可以继续使用该会话进行请求发送和响应,上述的整个过程就被称之为会话

2.会话跟踪

概述:

一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话的多次请求间共享数据。

  • 服务器会收到多个请求,这多个请求可能来自多个浏览器

  • 服务器需要识别请求是否来自同一个浏览器

  • 服务器用来识别浏览器的过程,这个过程就是会话跟踪

  • 服务器识别浏览器后就可以在同一个会话中多次请求之间来共享数据

思考问题1:一个会话中的多次请求为什么要共享数据呢?

在购物网站上购物时,需要先登录网站才能购物,而在真正购物时,你需要向服务器发送一个请求,而且你需要向服务器证明你的用户身份,否则服务器就会不知道购买者是谁,这时就需要共享刚才登录请求的数据;

思考问题2:为什么服务器和浏览器之间不支持数据共享?

  • 浏览器和服务器之间使用的是HTTP请求来进行数据传输

  • HTTP协议是无状态的,每次浏览器向服务器请求时,服务器都会将该请求视为新的请求

  • HTTP协议设计成无状态的目的是让每次请求之间相互独立,互不影响

  • 请求与请求之间独立后,就无法实现多次请求之间的数据共享

二、cookie

1.cookie是什么

客户端会话技术,将数据保存到客户端(浏览器),以后每次请求都携带Cookie数据进行访问

2.cookie的基本使用

对于cookie的使用,我们主要来看后端的操作,发送cookie和获取cookie

发送cookie

 //创建cookie对象,并设置数据
 Cookie cookie = new Cookie("key","value");
 ​
 //发送cookie到浏览器
 response.addCookie(cookie);

发送Cookie其实就是把Cookie添加到响应头里

接收cookie

 //获取cookie
 Cookie[] cookies = request.getCookies();
 //遍历cookie数组
 for (Cookie cookie : cookies) {
     //获取cookie的键
     System.out.println(cookie.getName());
     //获取cookie的值
     System.out.println(cookie.getValue());
 }

3.cookie的使用细节

1)cookie的存活时间

 //cookie对象的一个方法,用来设置cookie的存活时间
 setMaxAge(int seconds)

参数取值:

  • 负数默认值,将cookie存在浏览器的内存中,当浏览器关闭时,cookie就会被销毁

  • 正数:将Cookie写入浏览器所在电脑的硬盘的txt文件里,持久化存储。到时间自动删除(时间单位:秒)

  • :删除cookie

2)cookie存储中文

经过自己的实验,发现在最新的edge、firefox和谷歌浏览器中可以直接存储中文,无需处理。但是为了兼容性,还是建议对要存储的中文进行处理,因为在一些版本较老的浏览器上存储中文可能会报错。

cookie存储

 //对咬存储的中文进行编码处理
 String food = URLEncoder.encode("牛肉干", "UTF-8");
 //创建cookie
 Cookie cookie = new Cookie("food", food);
 //发送cookie
 response.addCookie(cookie);

cookie获取

 //获取cookie数组
 Cookie[] cookies = request.getCookies();
 //便利cookie数组
 for (Cookie cookie : cookies) {
     
     if (cookie.getName().equals("food")) {
         //对获取的值进行解码
         String value = URLDecoder.decode(cookie.getValue(), "UTF-8");
         System.out.println(cookie.getName() + ":" + value);
         break;
     }
 }

三、session

1.session是什么?

服务端会话跟踪技术,将数据保存在服务端。

数据存在服务单比存在客户端要安全

2.session的原理

cookie是存在浏览器上的,共享的数据可以直接在浏览器中获取;而session是存在服务器上的,共享的数据必须从服务器端获取,而不同的客户端应该只能获取自己的session(否则不就数据泄露了嘛),客户端是如何找到自己的session?

当某个浏览器像服务器请求首次创建session,服务器会将这个session的sessionId存到cookie对象中响应给浏览器。(JSESSIONID就是sessionId,后面的HttpOnly表示临时)

如果这个浏览器想要获取它的session的数据时,就需要向服务器发送请求,请求都会携带cookie,服务器就可以通过cookie中的sessionId获取到这个浏览器的session,从而就能获取共享的数据了。

注意:

1.这两次请求得到的session是同一个对象。

2.因为不同浏览器上cookie都是单独的,所以就算再一台电脑上,不同浏览器之间不能共享session的。

3.如果浏览器彻底关闭,之前的session就找不到了,这是因为cookie被销毁了,cookie中的sessionId也就没了,而不是因为session被销毁了

3.session的使用

获取session对象

 HttpSession session = request.getSession();

存放数据

 session.setAttribute("name", "wxl");

获取数据

 String name = session.getAttribute("name").toString();

4.session的销毁

1)自动销毁

默认情况下,无操作30分钟,就销毁

问题:记时的起点是什么?这30分钟是如何计算的?

从不操作服务器资源时开始计算,如果中途操作了服务器的资源则从头开始计算。

在web.xml配置session的销毁时间

 <?xml version="1.0" encoding="UTF-8"?>
 <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
          version="3.1">
 ​
     <!--配置session的销毁时间-->
     <session-config>
         <session-timeout>90</session-timeout>
     </session-config>
     
 </web-app>

2)手动销毁

调用Session对象的invalidate()进行销毁

5.session的钝化与活化(面试可能会问)

1)钝化

服务器正常关闭后,Tomcat会自动将session数据写入到硬盘文件中

2)活化

服务器再次启动后,会自动将这个文件中的数据加载到session,并删除这个文件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值