1.分布式系统 Session 共享方案(Session的发展史)
2。Session的简介
3. Session的原理
4.使用Session,极其的简单
1.分布式系统 Session 共享方案(Session的发展史)
1)Session在分布式项目中的地位:
分布式项目往往由许多项目进行整合,这就势必造就了很多跨域访问,以及负载均衡时的资源共享,首先明确传统的HttpSession是不能跨域的,也就说一个服务器是不能拿到另一个服务器的会话对象的
他们的逻辑大小是:每个tomcat包含各自项目,项目 里面最高的共享会话是ApplicationSession。
于是为了解决不同项目之间的Session共享出了下面几个方案:
1.Session广播:每个节点都需要不断的同步Session状态,资源浪费
2.使用Nginx代理:多个Tomcat分摊整个Session,单点故障资源丢失
3:自定义的方式实现Session:自己手动模拟Session的实现,结合cookie与redis实现,将Nginx原本存放到服务器端的map放到redis中
4:SpingSession:集成使用,上面自定的方式还是比较麻烦的,开始 很多人都是不断的把它打包成为一个封装类,然后使用,随着发展Spring直接帮我们搞定了,现在就是引入注解直接调用就行,连配都不配了。
2.Session简介:
Spring Session 是 Spring 一个顶级项目,可以使用 Redis 作为数据存储。同时还提供了 对 MongoDB 和 Geode 的支持的两个二级子项目
3. Session的原理:
大前提:JSP 页面没有禁用 Session 功能。服务器端内容调用过 request.getSession()
1)用户访问服务器的时候,服务器会判断请求是否写到了cookie,没有服务会创建一个cookie,key为jsession,value是长字符串。同时实例化一个Session对象,把Session对象放到了全局map,map的key是cookie的value,map的value是Session的对象,同时记录各种状态
2)服务器响应给客户端结果,响应对象中包含 Cookie 内容
3)客户端再次请求服务器端时会自动携带 Cookie 内容
4)服务器端再次接收请求后发现请求中 Cookie 带有 JSESSIONID,根据 JSESSION ID 的值进行从 Map 中取出 Session 对象,会判断 lastAccessedTime 和 maxActiveInterval 属性, 判断 Session 是否失效,如果失效执行 a)步骤重新创建 Session 对象。如果没有失效修改 lastAccessedTime 为当前访问时间
4.使用SpringSession
1)依赖,就需要这两个
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
2)注解 @EnableRedisHttpSession 注解:
没有特殊要求,完全可以不写,主要是设置一下个别参数
然后 就可以直接通过HttpSession直接使用了
// 补一个
// 异步请求携带 cookie 时,需要设置 allowCredentials=true 表示允许接收 cookie
@CrossOrigin(allowCredentials="true")