再谈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处理主页的生成)