java session和cookie

java的session原理

起因

为什么我们需要session机制?因为在web应用中,浏览器和服务器之间的通信是通过http来交互的。但是,http协议是一次性协议,所以,并没有提供相应的机制去保留每一次的交互的状态。这就产生了一些问题:某些页面的访问是有先后顺序的,这种关系要如何记录。比如说:用户在登陆以后,可以跳转到主页面,但是,如果没有相关的机制,用户直接发起主页面的url请求,服务器如何知道,这个用户有没有登陆,如果登陆了,他是谁?

为什么要用session

针对上面的浏览器时序图问题,我们提出了session策略。即:当用户第一次访问服务器的时候,服务器记住这次的访问者,并且生成一个sessionid,响应的时候,将sessionid返回给浏览器,下次浏览器访问的时候,就要将sessionid附带到请求中(三种方式,通常是配合cookie),这时,服务器检测sessionid,发现这个id是自己上次生成的(上次生成的sessionid会被存放在服务器的一个表中,遍历一下即可知道id是不是自己生成的),然后根据id就可以知道,这个用户是登陆了的,然后给他提供相应的功能和权限。

怎么编码用session

其实很简单,方案一:

  • 直接使用相应的方法:request.getsession()来获得session
  • 存到服务器session表中
  • 返回respond的时候,将session保存在响应的cookie中,让浏览器将这段id保存在本地。
  • 下次浏览器访问的时候,cookie内的id会自动放入http头文件中,只要服务器写个if判断就可以验证id了。
    方案二:
  • 直接自己定义一个map,赋值
  • 存到sessionid表中
  • 返回respond的时候,将session保存在响应的cookie中,让浏览器将这段id保存在本地。
    这种方式的sessionid的键和值都可以随意diy。
    方案一:代码

作用域问题引出传统的servlet交互方式

  1. request作用域:一个http请求可能由多个servlet去完成,原请求被一个servlet拦截,然后在处理的时候,调用其他servlet去处理这个请求,最后另一个servlet直接返回信息给前端。
  • 其中,各个servlet之间交互是通过request作用域的方式,setvalue和getvalue,可以将参数保存在请求的body中。这里有点类似微服务中,通过url调用其他服务,只不过,微服务最后是要返回到上一个调用者中,最后返回给前端;而这里不需要返回到上一个服务,直接就可以通过respond返回给前端,因为自始至终,servlet处理的都是一个request,返回的时候,也是根据HttpServletRequest调用write()方法直接写入信息即可。
  1. 同理,session作用域也是上面的原理,只不过共享的数据由servlet之间,变成了服务器和浏览器之间。
  2. application作用域则是服务器开启到结束期间,都有效。这个作用域中的content上下文将存储很多有用的信息。
  3. 参考:https://www.cnblogs.com/developing/p/11191984.html

参考资料

  1. 原理解释
  2. servlet按照微服务概念操作
  3. 传统web方式使用cookie+session进行登陆信息保存demo
  4. 一个cookie的demo
发布了54 篇原创文章 · 获赞 10 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_42031483/article/details/103309773