一,首页无用户信息
谷粒商城首页,点击超链接您好,请登录
,正常情况下应该跳转到Auth模块的login页面,登录成功后,会重定向到首页,超链接您好,请登录
应该替换为用户名。
但是实际开发过程中出现了这样一个问题,登录成功后,超链接您好,请登录
未被替换,再次点击这个超链接,不会跳转到登录界面,说明后台认为已经登录成功,直接重定向到首页了,但是首页没有拿到用户信息。
F12查看Application信息,也没有发现session
和cookie
信息。
二,定位
梳理登录流程,看看问题可能出现在哪个环节。
- 首页点击超链接
您好,请登录
- 跳转到
auth.gulimall.com/login.html
,这里很关键,商城用户认证模块的域名和首页域名不一致 - 认证模块完成用户验证后,将用户信息保存在
session
中 auth
模块的前端页面login.html
将session
信息保存在cookie
中,注意是保存在域名auth.gulimall.com
下- 重定向到首页,首页的域名是
gulimall.com
,所以不会携带cookie
信息,首页后端拿不到用户信息,无法渲染页面
解释问题原因:
- 登录功能是两个模块协同完成的,登录模块完成登录,在域名
auth.gulimall.com
下保存cookie
- 用户信息保存在认证服务的
session
中,首页模块的前端拿不到cookie,及时拿到了cookie
,也拿不到session
,因为session保存在auth认证服务的内存中,没有保存在首页所在的商品服务内存中,取不到用户信息。
下图可以看到auth.gulimall.com
下是有cookie
保存的。
三,两个问题
1,跨域名session共享
父域名获取不到子域名的cookie,这个可以在后台定制cookie,把域名的cookie设置为父域名。
Cookie cookie = new Cookie("JSESSIONID", session.getId());
cookie.setPath("/");
cookie.setDomain("gulimall.com");
servletResponse.addCookie(cookie);
注意,cookie
的name
、domain
、path
是非空的信息。
这样设置之后,在首页就能看到父域名有cookie
信息了。
即便如此,首页在渲染时仍然拿不到用户信息,因为用户session
信息保存在auth
任务服务的内存中,首页所在的product
服务是访问不到的。
还必须解决跨服务session共享问题。
2,分布式服务跨服务共享问题
参考谷粒商城实战笔记-227-商城业务-认证服务-SpringSession整合
谷粒商城实战笔记-228-商城业务-认证服务-自定义SpringSession完成子域session共享
问题记录
上面的问题解决后,登录成功后,首页还是不显示用户名。
原因是auth模块配置了json序列化方式,但是product模块没有配置。
解决方案
把auth模块的配置类copy到product模块即可。
@Configuration
public class GulimallSessionConfig {
@Bean
public CookieSerializer cookieSerializer() {
DefaultCookieSerializer cookieSerializer = new DefaultCookieSerializer();
//放大作用域
cookieSerializer.setDomainName("gulimall.com");
cookieSerializer.setCookieName("GULISESSION");
return cookieSerializer;
}
@Bean
public RedisSerializer<Object> springSessionDefaultRedisSerializer() {
return new GenericJackson2JsonRedisSerializer();
}
}