面试官:不用背概念,说清楚cookie和session是怎么交互的?

  

面试官:不用背概念,说清楚cookie和session是怎么交互的?

  前言

  共分为10个章节

  1.Java基础 2.网络 3.Java并发 4.JVM和JMM 5.数据库

  6.设计模式 7.Linux 8.框架 9.算法 10.工程

  本小节属于Java基础

  介绍

  这次先分享单机session,一定用大白话分享清楚,不扯概念。因为我原来面试别人的时候也问这个。被概念的人还是人还是很多的。

  Http协议使用的是无状态连接,这样会造成什么问题呢?看如下Demo

  

面试官:不用背概念,说清楚cookie和session是怎么交互的?

  测试

  

面试官:不用背概念,说清楚cookie和session是怎么交互的?

  

面试官:不用背概念,说清楚cookie和session是怎么交互的?

  HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,当在一个请求中时HttpServletRequest中的信息可以共享,而在不同的请求中HttpServletRequest并不能共享,这样就会造成手游卖号平台用户确实进行过登录操作,但是跳到购物车页面时发现并没有东西,应为应用并不知道访问这个页面的用户是谁

  

面试官:不用背概念,说清楚cookie和session是怎么交互的?

  

面试官:不用背概念,说清楚cookie和session是怎么交互的?

  对客户的第一个请求,容器会生成一个唯一的会话ID,并通过响应把它返回给客户。客户再在以后的每一个请求中发回这个会话ID。容器看到ID后,就会找到匹配的会话,并把这个会话与请求关联

  

面试官:不用背概念,说清楚cookie和session是怎么交互的?

  

面试官:不用背概念,说清楚cookie和session是怎么交互的?

  

面试官:不用背概念,说清楚cookie和session是怎么交互的?

  果然能保存会话状态了,客户和容器如何交换会话ID信息呢?其实是通过cookie实现的

  

面试官:不用背概念,说清楚cookie和session是怎么交互的?

  

面试官:不用背概念,说清楚cookie和session是怎么交互的?

  看上面能保存会话的代码,我们并没有对cookie进行操作啊,其实是容器几乎会做cookie的所有工作,从最开始的Servlet开始讲这些操作是如何实现的,先看一下Servlet执行过程

  1.用户点击页面发送请求->Web服务器应用(如Apache)->Web容器应用(如tomcat)

  2.容器创建两个对象HttpServletRequest和HttpServletResponse

  3.根据URL找到servlet,并为请求创建或分配一个线程,将请求和响应对象传递给这个servlet线程

  4.容器调用Servlet的service()方法,根据请求的不同类型,service()方法会调用doGet()和doPost()方法,假如请求是HTTP GET请求

  5.doGet()方法生成动态页面,并把这个对象塞到响应对象里。容器有响应对象的一个引用

  6.线程结束,容器把响应对象装换为一个HTTP请求,把它发回给客户,然后删除请求和响应对象

  Spring MVC框架其实在Servlet上面封装了一层,当我们自己用Servlet编写程序时,可以从HttpServletRequest中获取HttpSession,如下

  

面试官:不用背概念,说清楚cookie和session是怎么交互的?

  在响应中发送一个会话cookie

  HttpSession session=req.getSession();

  我们只需要写上述一行代码即可,来看看容器帮我们做了哪些事情

  建立一个新的HttpSession对象生成唯一的会话ID建立新的Cookie对象把会话Id放到cookie中在响应中设置cookie

  从请求得到会话ID

  HttpSession session=req.getSession();

  

面试官:不用背概念,说清楚cookie和session是怎么交互的?

  如上面用的方法,我们并没有直接从HttpServletRequest 中获取HttpSession

  能直接获取到HttpSession,其实是框架帮我们执行了HttpSession session=req.getSession(),然后设置进来的。我们可以设置session的过期时间,以保证用户登录后长期不操作需要重新登录。

  tomcat是用如下结构来保存session的

  protected Map sessions=new ConcurrentHashMap()

  值为会话id,session对象是保存一个会话的各种属性,就是你调用类似代码的时候

  session.setAttribute("username", username);

  可以设置很多个啊,你应该也猜到了,在tomcat中保存会话属性是用map来保存的

  protected Map attributes=new ConcurrentHashMap();

  如果我们不自己new cookie而通过req.getSession()来设置cookie,那么cookie的名字为

  JSESSIONID,值为会话id,前面图片中有哈。

  第一次登陆,reponse设置一个cookie( JSESSIONID=会话id)

  以后每次登陆带着这个cookie,通过key为JSESSIONID拿到会话id,因为cookie可以设置很多个哈。

  通过JSESSIONID就能拿到session了,拿到session你就能拿出来登陆设置的各种属性了哈,就能判断出来这个是哪个用户了。

  概念就不说了,过程还没明白的可以留言哈。

上一篇:ELF文件格式-第一讲,详解程序文件头


下一篇:CMMI之功能点估算法:EI 、EQ、EO