前言
共分为10个章节
1.Java基础 2.网络 3.Java并发 4.JVM和JMM 5.数据库
6.设计模式 7.Linux 8.框架 9.算法 10.工程
本小节属于Java基础
介绍
这次先分享单机session,一定用大白话分享清楚,不扯概念。因为我原来面试别人的时候也问这个。被概念的人还是人还是很多的。
Http协议使用的是无状态连接,这样会造成什么问题呢?看如下Demo
测试
HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,当在一个请求中时HttpServletRequest中的信息可以共享,而在不同的请求中HttpServletRequest并不能共享,这样就会造成手游卖号平台用户确实进行过登录操作,但是跳到购物车页面时发现并没有东西,应为应用并不知道访问这个页面的用户是谁
对客户的第一个请求,容器会生成一个唯一的会话ID,并通过响应把它返回给客户。客户再在以后的每一个请求中发回这个会话ID。容器看到ID后,就会找到匹配的会话,并把这个会话与请求关联
果然能保存会话状态了,客户和容器如何交换会话ID信息呢?其实是通过cookie实现的
看上面能保存会话的代码,我们并没有对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
HttpSession session=req.getSession();
我们只需要写上述一行代码即可,来看看容器帮我们做了哪些事情
建立一个新的HttpSession对象生成唯一的会话ID建立新的Cookie对象把会话Id放到cookie中在响应中设置cookie
从请求得到会话ID
HttpSession session=req.getSession();
如上面用的方法,我们并没有直接从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你就能拿出来登陆设置的各种属性了哈,就能判断出来这个是哪个用户了。
概念就不说了,过程还没明白的可以留言哈。