当前位置: 首页 > ds >正文

再谈cookie和session(结合表白墙具体案例)

注意文中的部分案例沿用上一篇:

表白墙程序-CSDN博客

Cookie是浏览器在本地持久化存储数据的一种机制.

1.cookie的数据从哪里来?

答:服务器返回给浏览器的

2.cookie中的数据长什么样子?

答:cookie中是键值对结构的数据.并且这里的键值对都是程序员自定义的.

3.cookie有什么作用?

答:cookie就可以在浏览器这边存储一些"临时性的数据"其中最典型的一种使用方式,就是用来存储"身份标识"(sessionid,这里就涉及到cookie(浏览器存储数据)和session(服务器存储数据)之间的联动了)

服务器存储数据主要是用来存储用户的详细信息,同时给这个用户分配一个sessionid(唯一值),也会把sessionid发到浏览器的cookie中.后续再访问该网站的其他页面的时候,请求中就会自动带上刚才的sessionid,进一步浏览器就可以知道当前是哪个用户在操作了.

4.cookie到哪里去?

cookie中的内容会在下次访问该网站的时候,自动的被代到http请求中.

5.cookie怎么存的?

浏览器按照不同的"域名"分别存储cookie.域名和域名之间的cookie是不能干扰的.cookie是存储在硬盘上的,cookie存储一般都会有一个超时时间.

cookie操作

把cookie添加到响应中,在http响应报文中,加了一个Set-cookie header

访问set cookie这个请求的时候,代码中就会构造cookie放到响应中.

后续再次发送请求的时候,cookie内容就会出现在请求中.此时我们再次访问GetCookie.

此时服务器中就能拿到cookie的内容了.

这个过程中,Cookie 里的数据只是在浏览器暂时歇歇脚,实际上真正发挥作用,还是得在服务器这边的逻辑中生效的.还可以使用 Cookie 结合 Session 实现登录效果.此时就是能更清楚的看出来,当前 Cookie 工作过程了.

Servlet 也提供了 Session 相关的支持.

实现登录功能,不需要直接使用 Cookie api,直接使用 session 的 api 就可以了.

Session操作

getSession()方法.是最最核心的api.

效果有两方面

1.如果当前用户没有session(会话),就会创建出session.

2.如果已经有了session,就能够查询到这个session

session 存在的意义,也是为了让用户能够保存一些自定义的数据,此处session更像是一个Map

此时,程序员想保存什么样子的键值对,就可以直径进行设置了.

session 这个东西,在一个服务器上,是存在很多份的,每个用户都应该有一个自己的 session.一个服务器同时有多个用户.服务器就会使用Map的方式来组织多个session

登录页面

通过编写登录页面,使用上述api.进一步体会cookie和session之间的作用.

密码框

这就是我们刚写的页面.当前这个页面是一个form表单,当用户点击登录按钮就会发起一个http请求.

形如:

POST login

Content-Type:application/x-www-form-urlencoded

username=zhangsan&password=123

服务器这边就可以根据这个请求来作出处理

在这里,关于getSession的参数做一个分析

1.参数为true(登陆时使用)

不存在会话就创建

存在会话就直接查询

2.参数为false(后续跳转到其他页面,检查用户的登陆状态时使用)

不存在会话就返回null

存在会话就直接查询

getSession背后做的事情:

1.先读取请求中的 Cookie,看 Cookie 里是否有JSESSIONID 属性(sessionid是一个广义的概念,不同的库中具体实现过程中会有一些细节的差异,在servlet中,把这个属性具体叫做JSESSIONID),以及是什么.

如果没有,就认为需要创建新会话.如果有,就拿着这个id区查询看看当前的session是否存在,要是session存在,就直接返回该session,要是session不存在,就准备创建新会话.

2.当前确实需要创建会话,就会创建出一个session对象,同时生成一个唯一的JSESSIONID,以JSESSIONID为key,Session对象为value,把这个键值对给插入到服务器上述的哈希表中.

3.刚才生成的JSESSIONID又会通过GetCookie方法,加入到响应中.此时响应里就会带有Set-Cookie字段,这里的值就是JSESSION=XXXXXX.通过响应就把JSESSIONDI返回到浏览器这边了.

那么,什么样的情况下会出现有sessionid,但没有session呢?

例:服务器这边存储上述这些session对象也是在内存中进行的.比如把sessionid返回给浏览器了,sessionid和和session对象是保存在服务器内存的.此时如果服务器重启了,内存中的这些会话数据就没了.但是浏览器中的sessionid这个Cookie还是存在的.其实session保存到内存中,这样的设定其实也不是很合理,因此实践中往往会把会话保存到其他的介质上(MySQL,Redis...),来达到"持久化存储"的目的

我们先直接访问index页面,可以看到"请先登录". 输入正确的密码后

就可以跳转到我们的主页了.

注意:这里的时间是指登录时间而不是访问时间.除非这个会话过期,不然这里的时间不会发生改变.

当前这个程序,就涉及到三个部分进行联动.

1.登录页面(静态的html,使用form构造http请求)

2.LoginServlet(doPost处理登录的逻辑流程 1234)

3.IndexServlet(doGet处理主页的生成)

http://www.xdnf.cn/news/3153.html

相关文章:

  • 第一讲 | 算法复杂度
  • Jmeter接口自动化测试读取用例
  • 软件设计师-软考知识复习(2)
  • 边缘计算服务器
  • C++类和对象(2)关于类的默认成员函数
  • python初学
  • 【论文_序列转换模型架构_20230802v7】Attention Is All You Need 【Transformer】
  • Android第五次面试总结之网络篇(修)
  • 经典算法 最长单调递增子序列
  • Stable Diffusion基础配置
  • 使用 v-print 实现 Vue 项目中的打印功能
  • rust 全栈应用框架dioxus
  • 深入解析常见排序算法及其 C# 实现
  • 系统思考培训助力总经理
  • AI预测3D新模型百十个定位预测+胆码预测+去和尾2025年4月29日第67弹
  • RISE with SAP 的合同及许可解析
  • 【电子对抗训练革命】新一代便携式雷达模拟器技术解密
  • Spring事务开发经验 回滚和不回滚?
  • ADS1299模拟前端(AFE)代替芯片——LHE7909
  • C事件驱动网络库​​libevent的http详解
  • Java实现使用EasyExcel按模板导出文件
  • 【Unity】使用LitJson保存和读取数据的例子
  • SQL注入
  • Leetcode 3533. Concatenated Divisibility
  • 【C到Java的深度跃迁:从指针到对象,从过程到生态】第四模块·Java特性专精 —— 第十七章 IO流:超越FILE*的维度战争
  • SpringBoot之SpringAl实现AI应用-快速搭建
  • LeetCode -160.相交链表
  • “假读“操作在I2C接收流程中的原因
  • DECAP CELL
  • Qt入门——什么是Qt?