1、分布式环境下Session共享问题:

2、几种解决方法

3、通过后端统一存储方法在实际项目中问题的体现:

当session的作用域只限于auth.gulimall.com时,在auth.gulimall.com下登录账号所返回包含用户信息的session无法共享给gulimall.com

当我们把作用域放大更改为.gulimall.com时,auth.gulimall.com下登录账号所返回包含用户信息的session就能共享给gulimall.com

 至此解决session共享跨域问题的核心关键为放大session的作用域范围。

4、利用SpringSession作用域问题

①导入必要的包

        <!--springsession解决session共享问题-->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
<version>2.2.0.RELEASE</version>
</dependency>

②在需要进行session共享的微服务的配置文件中添加指定session存取至redis

spring.session.store-type=redis

③在需要进行session共享的微服务主启动类上开启reids的session的存取功能

@EnableRedisHttpSession//整合redis作为session存取
@EnableDiscoveryClient
@EnableFeignClients
@SpringBootApplication
public class GulimallAuthServerApplication { public static void main(String[] args) {
SpringApplication.run(GulimallAuthServerApplication.class, args);
} } @EnableRedisHttpSession//整合redis作为session存取
@EnableCaching
@EnableFeignClients(basePackages = "com.atguigu.gulimall.product.feign")
@EnableDiscoveryClient
@MapperScan(basePackages = "com.atguigu.gulimall.product.dao")
@SpringBootApplication
public class GulimallProductApplication { public static void main(String[] args) {
SpringApplication.run(GulimallProductApplication.class, args);
} }

④让session在不同域名下进行共享并对session进行序列化并以json格式的方式储存

官方文档:

 实际代码:

@Configuration
public class GulimallSessionConfig {
//解决session跨域问题
@Bean
public CookieSerializer cookieSerializer() {
DefaultCookieSerializer cookieSerializer= new DefaultCookieSerializer();
//将session作用域放大到*.gulimall.com
cookieSerializer.setDomainName("gulimall.com");
cookieSerializer.setCookieName("GULISESSION");
/* serializer.setCookieName("JSESSIONID");
serializer.setCookiePath("/");
serializer.setDomainNamePattern("^.+?\\.(\\w+\\.[a-z]+)$");*/
return cookieSerializer;
} //Session序列化后转为json格式
@Bean
public RedisSerializer<Object> springSessionDefaultRedisSerializer() {
return new GenericJackson2JsonRedisSerializer();
}
}

5、结果:

当我在auth.gulimall.com域名下的登录服务下将用户的账户信息传入session时:

if (oauthlogin.getCode()==0){
MemberResVo data = oauthlogin.getData("data", new TypeReference<MemberResVo>() {});
//TODO:1、session只作用当前域,无法跨域访问
//TODO:2、希望能使用JSON序列化对象 session.setAttribute("loginUser",data);
return "redirect:http://gulimall.com";
}

此处使用MemberResVo实体类,所以要对其进行序列化:

@ToString
@Data
public class MemberResVo implements Serializable {
private Long id;
/**
* 会员等级id
*/
private Long levelId;
/**
* 用户名
*/
private String username;
/**
* 密码
*/
private String password; //private .....
//private .....
}

至此我们可以将session返回给gulimall.com取得值并进行显示:

<a href="http://auth.gulimall.com/login.html">你好,[[${session.loginUser!=null?(session.loginUser.nickname!=null?session.loginUser.nickname:session.loginUser.socialUid):'请登录'}]]</a>

6、@EnableRedisHttpSession原理

@EnableRedisHttpSession导入RedisHttpSessionConfiguration.class
1、RedisHttpSessionConfiguration在容器中添加了RedisIndexedSessionRepository组件:redis操作session,对数据进行持久化处理

2、被RedisHttpSessionConfiguration继承的SpringHttpSessionConfiguration中添加了SessionRepositoryFilter(session过滤器)
2.1、SessionRepositoryFilter创建时自动获取到SessionRepository;
2.2、SessionRepositoryFilter的doFilterInternal方法把原生的request和response被包装成wrappedRequest和wrappedResponse,以后获取session将不再通过原生的request.session()方法而是通过wrappedRequest.getsession(),wrappedRequest.getsession()方法中重写了request.session(),wrappedRequest.getsession()的session是从SessionRepository获取得到的,做到从redis获取session

核心代码:

所以,我们可以通过自定义SessionRepository接口更改对session的增删查改方法

分布式环境下Session共享问题解决和原理讲解的更多相关文章

  1. Tomcat集群环境下session共享方案 通过memcached 方法实现

    对于web应用集群的技术实现而言,最大的难点就是:如何能在集群中的多个节点之间保持数据的一致性,会话(Session)信息是这些数据中最重要的一块.要实现这一点, 大体上有两种方式:一种是把所有Ses ...

  2. 【SpringBoot】spring-session-data-redis 解决集群环境下session共享

    为什么会产生Session共享问题   集群情况下,session保存在各自的服务器的tomcat中,当分发地址至不同服务时,导致sesson取不到,就会产生session共享问题. 解决方案 负载均 ...

  3. 【转】分布式环境下5种session处理策略(大型网站技术架构:核心原理与案例分析 里面的方案)

    前言 在搭建完集群环境后,不得不考虑的一个问题就是用户访问产生的session如何处理.如果不做任何处理的话,用户将出现频繁登录的现象,比如集群中存在A.B两台服务器,用户在第一次访问网站时,Ngin ...

  4. Shiro权限管理框架(二):Shiro结合Redis实现分布式环境下的Session共享

    首发地址:https://www.guitu18.com/post/2019/07/28/44.html 本篇是Shiro系列第二篇,使用Shiro基于Redis实现分布式环境下的Session共享. ...

  5. 集群/分布式环境下5种session处理策略

    转载自:http://blog.csdn.net/u010028869/article/details/50773174?ref=myread 前言 在搭建完集群环境后,不得不考虑的一个问题就是用户访 ...

  6. 【架构师之路】集群/分布式环境下5种session处理策略

    [架构师之路]集群/分布式环境下5种session处理策略   转自:http://www.cnblogs.com/jhli/p/6557929.html 在搭建完集群环境后,不得不考虑的一个问题就是 ...

  7. 【转】集群/分布式环境下5种session处理策略

    转载至:http://blog.csdn.net/u010028869/article/details/50773174 在搭建完集群环境后,不得不考虑的一个问题就是用户访问产生的session如何处 ...

  8. 集群/分布式环境下,Session处理策略

    前言 在搭建完集群环境后,不得不考虑的一个问题就是用户访问产生的session如何处理.如果不做任何处理的话,用户将出现频繁登录的现象.比如集中中存在A.B两台服务器,用户在第一次访问网站是,Ngin ...

  9. redis 与java的连接 和集群环境下Session管理

    redis 的安装与设置开机自启(https://www.cnblogs.com/zhulina-917/p/11746993.html)  第一步: a) 搭建环境 引入 jedis jar包 co ...

  10. [源码解析] TensorFlow 分布式环境(5) --- Session

    [源码解析] TensorFlow 分布式环境(5) --- Session 目录 [源码解析] TensorFlow 分布式环境(5) --- Session 1. 概述 1.1 Session 分 ...

随机推荐

  1. tryhackme_nmap

    https://www.cnblogs.com/-Lucky-/p/17100073.html Nmap基本端口扫描 nmap中考虑的端口状态 Open:表示服务正在侦听指定端口. Closed:表示 ...

  2. Nginx 反向代理的配置和注意点(成功配置)

    反向代理配置成功 首先,Nginx 和 Java 后端都运行在云服务器的 docker 容器中.ps: 需要确保云服务器端口正常开放,以及两个容器都能被正常的访问. 现在想让 ng 做反向代理达到如下 ...

  3. Java革命性ORM框架之快速上手的Jimmer

    Jimmer是一款革命性的ORM框架,它的目标是提供一个简单易用的API,帮助开发人员更加轻松地操作数据库.Jimmer使用了Java 8的新特性,如Lambda表达式和Stream API,使得代码 ...

  4. FnOnce , FnMut <RUST>

    FnOnce 1 #[lang = "fn_once"] 2 #[must_use = "closures are lazy and do nothing unless ...

  5. Hello Welcome to my blog!

    Hello Welcome to my blog!

  6. 【whale-starry-stl】01天 list学习笔记

    一.知识点 1. std::bidirectional_iterator_tag std::bidirectional_iterator_tag 是 C++ 标准库中定义的一个迭代器类型标签,用于标识 ...

  7. 洛谷 P5540 [BalkanOI2011] timeismoney | 最小乘积生成树

    题意 给一个无向图,边有两个权 \(a\) 和 \(b\),定义一个生成树的权值是 \(\left(\sum\limits_{e\in T}a_e\right)\left(\sum\limits_{e ...

  8. .Net下验证MongoDB 的 Linq 模式联合查询是否可用

    MongoDB.Driver 类库提供了 Linq 查询的支持.然而,在使用 Linq 进行联合查询时,是否能够正确转换为 MongoDB 底层的查询语句还有待验证.今天,我将进行实验来验证一下. 输 ...

  9. 通信原理知识点总结(XDU网信通原)

    因为感觉第2章和第7章内容特别乱,当时老师讲的时候好像也没有按照一个正确的顺序来讲,所以我就把这两部分的内容按照结构顺序整理了一下,这样更便于理解和记忆 第2章 无线信道传输特性 显示不全点链接看完整 ...

  10. windows CMD命令的一些使用方法及注意事项

    windows CMD命令的一些使用方法及注意事项 转载请著名出处:https://www.cnblogs.com/funnyzpc/p/17572397.html 一.执行路径或参数带中文.空格.特 ...