当前位置:   article > 正文

OAuth2.0 or Spring Session or 单点登录流程

OAuth2.0 or Spring Session or 单点登录流程

1.社交登录

 

 2.微博社交登录 第三方登录 

1.登录微博

2.点击网站接入

 

3.填写完信息,到这里,写入成功回调 和 失败回调 

是重定向,所以可以写本地的地址 

 3.认证 分布式Session spring-session

域名不一样 发的 jSessionId 就不同,根据域名区分服务器的,一个服务器创建一个 cookie存jSessionId

 

 

 

分布式Session原理,使用子域名,的时候放入父域名的 JsessionId 然后将这个ID 的所存的内容放入Redis ,这样实现不同域名共享同一sessionID. 

4.SpringSession

1.导入依赖

老版本需要导入下面两个依赖要不然报错

  1. <dependency>
  2. <groupId>org.springframework.session</groupId>
  3. <artifactId>spring-session-data-redis</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>redis.clients</groupId>
  7. <artifactId>jedis</artifactId>
  8. </dependency>
  9. <dependency>
  10. <groupId>io.lettuce</groupId>
  11. <artifactId>lettuce-core</artifactId>
  12. </dependency>

2.yml配置  

  1. server:
  2. port: 20000
  3. servlet:
  4. session:
  5. timeout: 30m #30分钟 SESSION过期时间
  6. #配置数据源
  7. spring:
  8. session:
  9. store-type: redis
  10. application:
  11. name: gulimall-auth-server #服务名称
  12. cloud:
  13. nacos:
  14. discovery:
  15. server-addr: 192.168.2.36:8848 #nacos注册中心的地址
  16. thymeleaf:
  17. cache: false
  18. redis:
  19. host: 192.168.232.209
  20. port: 6379
  21. database: 0

3.开启自动配置

@EnableRedisHttpSession//整合 redis 作为 session存储
  1. package com.jmj.gulimall.controller;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.web.bind.annotation.GetMapping;
  4. import org.springframework.web.bind.annotation.ResponseBody;
  5. import javax.servlet.http.HttpSession;
  6. @Controller
  7. public class IndexController {
  8. @GetMapping("/loginUser")
  9. @ResponseBody
  10. public String loginUser(HttpSession httpSession){
  11. httpSession.setAttribute("loginUser",new User("123","jmj"));
  12. return "登录成功";
  13. }
  14. }

  1. package com.jmj.gulimall.config;
  2. import org.springframework.context.annotation.Bean;
  3. import org.springframework.context.annotation.Configuration;
  4. import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
  5. import org.springframework.data.redis.serializer.RedisSerializer;
  6. import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
  7. @Configuration(proxyBeanMethods = false)
  8. @EnableRedisHttpSession//整合 redis 作为 session存储
  9. public class Config {
  10. @Bean
  11. public RedisSerializer<Object> springSessionDefaultRedisSerializer() {
  12. return new GenericJackson2JsonRedisSerializer();
  13. }
  14. }

 Controller

  1. package com.jmj.gulimall.controller;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.web.bind.annotation.GetMapping;
  4. import org.springframework.web.bind.annotation.ResponseBody;
  5. import javax.servlet.http.HttpSession;
  6. @Controller
  7. public class IndexController {
  8. @GetMapping("/loginUser")
  9. @ResponseBody
  10. public String loginUser(HttpSession httpSession){
  11. httpSession.setAttribute("loginUser",new User("123","jmj"));
  12. return "登录成功";
  13. }
  14. @GetMapping("/getSession")
  15. @ResponseBody
  16. public User getSession(HttpSession httpSession){
  17. User loginUser = (User) httpSession.getAttribute("loginUser");
  18. return loginUser;
  19. }
  20. }

 4. 2.6.7 springboot 版本之后只用配置配置文件就可以了

5.还存在一点问题 

1.默认发的令牌, session= dsajkdjl 作用域:当前域(子域Session共享问题)

2.使用JSON的序列化方式来序列化对象数据到redis中

  1. package com.jmj.gulimall.config;
  2. import com.fasterxml.jackson.databind.ObjectMapper;
  3. import org.springframework.context.annotation.Bean;
  4. import org.springframework.context.annotation.Configuration;
  5. import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
  6. import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
  7. import org.springframework.data.redis.serializer.RedisSerializer;
  8. import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
  9. import org.springframework.session.web.http.CookieSerializer;
  10. import org.springframework.session.web.http.DefaultCookieSerializer;
  11. @Configuration(proxyBeanMethods = false)
  12. @EnableRedisHttpSession//整合 redis 作为 session存储
  13. public class Config {
  14. @Bean
  15. public RedisSerializer<Object> springSessionDefaultRedisSerializer(ObjectMapper objectMapper) {
  16. return new GenericJackson2JsonRedisSerializer(objectMapper);//使用不带包名的JSON序列化
  17. }
  18. @Bean
  19. public CookieSerializer cookieSerializer(){
  20. DefaultCookieSerializer cookieSerializer = new DefaultCookieSerializer();
  21. cookieSerializer.setCookieMaxAge(60);//单位 : 秒
  22. cookieSerializer.setDomainName("jmjStudy.com");//设置子域名
  23. cookieSerializer.setCookieName("JMJSession");//session名字
  24. return cookieSerializer;
  25. }
  26. }
  1. package com.jmj.gulimall.controller;
  2. import cn.hutool.core.bean.BeanUtil;
  3. import org.springframework.stereotype.Controller;
  4. import org.springframework.web.bind.annotation.GetMapping;
  5. import org.springframework.web.bind.annotation.ResponseBody;
  6. import javax.servlet.http.HttpSession;
  7. @Controller
  8. public class IndexController {
  9. @GetMapping("/loginUser")
  10. @ResponseBody
  11. public String loginUser(String name,HttpSession httpSession){
  12. httpSession.setAttribute("loginUser",new User("123",name));
  13. return "登录成功";
  14. }
  15. @GetMapping("/getSession")
  16. @ResponseBody
  17. public User getSession(HttpSession httpSession){
  18. Object loginUser = httpSession.getAttribute("loginUser");
  19. User user = BeanUtil.copyProperties(loginUser, User.class);
  20. return user;
  21. }
  22. @GetMapping("/user")
  23. @ResponseBody
  24. public com.jmj.gulimall.config.User getserSession(HttpSession httpSession){
  25. Object loginUser = httpSession.getAttribute("loginUser");
  26. com.jmj.gulimall.config.User user = BeanUtil.copyProperties(loginUser, com.jmj.gulimall.config.User.class);
  27. return user;
  28. }
  29. }

所有服务存取Session 都在Redis  用的SessionId都是同一个,这样就可以达到所有服务都可以共享域 的SessonId 解决了分布式Session的问题。

6.SpringSession原理

一句话精辟解释: 在过滤器放行的时候,偷偷的把原生的 request 和 response 对象换成了它的实现,也就是 调用getSession 的时候拿到的 其实是对redis 操作的Session。但其他的操作还是使用原生的,只不过重写的方法,调用的是子类的,也就是往 redis 里放入 Session,把原生的操作给替换了!

在细节讲一下 : cookie 过期时间 和 Session过期时间不是一个东西

cookie是存储在浏览器客户端的 

session是存放在服务器的 ,

cookie过期了 浏览器拿不到 jsessionId 也就拿不到数据

session过期了 更拿不到,因为存储都没有了

然后浏览器执行请求, 对session进行操作的时候 会对session进行续期  

但是cookie不会续期,cookie过期了浏览器就不会带着cookie来访问服务器了,再次访问,服务器将会颁发一个新的cookie 

完美!!!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/煮酒与君饮/article/detail/861270
推荐阅读
相关标签
  

闽ICP备14008679号