1.解释Session
Session 是客户端与服务器通讯会话技术, 比如浏览器登陆、记录整个浏览会话信息。session存放在服务器,关闭浏览器不会失效。
1.1Session实现原理
客户对向服务器端发送请求后,Session 创建在服务器端,返回Sessionid给客户端浏览器保存在本地,当下次发送请求的时候,在请求头中传递sessionId获取对应的从服务器上获取对应的Sesison
请求过程:
服务器端接受到客户端请求,会创建一个session,使用响应头返回 sessionId给客户端。客户端获取到sessionId后,保存到本地。
下次请求:客户端将本地的sessionId通过请求头发送到服务器。服务器从请求头获取到对应的sessionId,使用sessionId在本地session内存中查询。
代码解析
//默认创建一个session 默认值为true没有找到对应的session 自动创建session
HttpSession session = request.getSession();
//true的情况是 客户端使用对应的sessionId查询到对应的session会直接创建一个新的session 如果有的话直接覆盖之前的
//false 客户端使用对应的sessionId查询不到对应的session 不会创建新的session
HttpSession session = request.getSession(false)
session 包括 sessionId和sessionValue
session本身是临时的 token(令牌)与 sessionId很相似 保证了临时且唯一
2.要用 session + redis 共享session的原因
先进的企业级或者大型的网站平台,都是分布式结构,分布式的好处是通过nginx分发请求,让多个服务器各自处理请求,来减少单一服务器的压力,并且提高执行效率。
在这个分布式结构下,如果不用共享session的话,就会出现问题。当一个客户端发送一个请求(无session),通过nginx将第一次请求分发给服务器1,服务器判断无session,就让那个客户进行登录操作,并得到响应,此时客户端会存储一个来自服务器1响应的session,并存储在客户端。
当客户端发送第二次请求的时候,此时本次请求已经携带了session(跳过登录),nginx却将请求分发给服务器2,因为服务器2中没有session,所以无法与客户端session进行对应。所以程序会出现异常或是报错,无法正常响应。
2.1 解决方法 : session + redis 实现session 共享
2.2session + redis 实现session 共享原理
为了避免上面session 在服务器直接不共享的问题,就将 session 放入 redis 中。
当客户端第一次发送请求后,nginx将请求分发给服务器1 ,然后将服务器1 产生的session 放入redis中,这样的话 客户端、服务器1 和redis中都会有一个相同的session,当客户端发送第二次请求的时候,nginx将请求分发给服务器2 (已知服务器2 中无session),因为客户端自己携带了一个session,那么服务器2 就可以拿着客户端带来的session中的session ID去redis中获取session,只要拿到这个session,就能执行之后的操作。
转载于下面两篇文章
https://blog.csdn.net/grabungen/article/details/91950667
https://www.cnblogs.com/toov5/p/9903017.html