首页 > 数据库 >cookie+session(这里使用redistemplate代替)实现单点登录流程

cookie+session(这里使用redistemplate代替)实现单点登录流程

时间:2023-07-25 23:55:05浏览次数:31  
标签:redirect String url value token session cookie redistemplate

 

  1. user发起资源请求(带上回调的路径方便回调),通过判断是否浏览器的cookie中是否存在登录过的痕迹,比如有人登了,然后存了一个cookie到浏览器

  2. 如果拿到了cookie是有东西的,则带上这个cookie的内容返回给client,如果没有东西,则继续登录,向session中存入userInfo,并给浏览器设置cookie

  3. 另一个相信任的应用再发起资源请求的时候会发现已经被登录过了,直接去session中拿出信息然后回显就完事了

 

sso-server

controller

 @Controller
 public class LoginController {
 ​
 ​
     static String redirect_url;
 ​
     /**
      * 跳转到登录页面
      * @param redirect_url
      * @return
      */
     @GetMapping(value = "/login.html")
     public String toLogin(@RequestParam(value = "redirect_url") String redirect_url,
                           @CookieValue(value = "sso_token",required = false) String token){
 ​
         // 如果token不为空,表示有人登录过,其他授信应用也可以直接登陆
         if(!StringUtils.isEmpty(token)){
             System.out.println("token: " + token);
             return "redirect:"+LoginController.redirect_url + "?token="+token;
         }
 ​
 ​
         LoginController.redirect_url = redirect_url;
         return "login";
     }
 ​
     @Resource
     private RedisTemplate<String,String> redisTemplate;
 ​
     @PostMapping(value="/dologin")
     public String doLogin(@RequestParam(value = "username") String username,
                           @RequestParam(value = "password") String password,
                           HttpServletResponse response,
                           @CookieValue(value = "sso_token",required = false) String token) {
         // 登录成功的逻辑
         if(!StringUtils.isEmpty(username) && !StringUtils.isEmpty(password)){
             UserVo userVo = new UserVo();
             userVo.setUsername(username);
             userVo.setPassword(password);
 ​
             System.out.println("userVo = " + userVo);
             String uuid = createUUID();
 ​
             // 将token令牌保存到cookie中
             Cookie cookie = new Cookie("sso_token", uuid);
             response.addCookie(cookie);
             System.out.println("设置token成功cookie");
             // store to redis to save
             redisTemplate.opsForValue().set(uuid,userVo.getUsername());
 ​
             System.out.println("redirect_url = " + LoginController.redirect_url);
 ​
 //          将token拼接上,一同返回给client让他们存到redis
             String url = LoginController.redirect_url + "?token=" + uuid;
             return "redirect:"+url;
         }
         // 登录失败 to login
         return "login";
     }
     public String createUUID(){
         return UUID.randomUUID().toString().replace("-", "");
     }
 ​
 }
 ​

sso-client

controller

 @Controller
 public class HelloController {
 ​
     @Value(value = "${sso.server.url}")
     String ssoServerUrl;
 ​
     @ResponseBody
     @GetMapping(value = "/hello")
     public String hello() {
         return "hello page";
     }
 ​
     @Resource
     RedisTemplate<String,String> redisTemplate;
 ​
     @GetMapping(value = "/users")
     public String usersInfo(HttpSession session,
                             @RequestParam(value = "token",required = false) String token,
                             Model model) {
         /**
          * 表示返回的时候带上了,带上了就表示登录成功了
          */
         if(!StringUtils.isEmpty(token)){
 ​
 ​
             System.out.println("client1 token = " + token);
 ​
             String userInfo = redisTemplate.opsForValue().get(token);
             System.out.println("userInfo = " + userInfo);
 ​
             model.addAttribute("username",userInfo);
             return "list";
         } else {
             String suffixUrl = "?redirect_url=http://client2.com:8092/users";
             // 远程登录验证 sso - server
             return "redirect:"+ssoServerUrl + suffixUrl;
         }
 ​
 }
 ​

 

标签:redirect,String,url,value,token,session,cookie,redistemplate
From: https://www.cnblogs.com/huoziqi/p/17581338.html

相关文章

  • APP - Appium-Inspector连接报错Failed to create session, The requested resource c
    APP-Appium-Inspector连接报错Failedtocreatesession,Therequestedresourcecouldnotbefoundappium版本:Appium-Server-GUI-windows-1.22.3-4Appium-Inspector版本:Appium-Inspector-windows-2022.5.4填写好参数连接时报错: 错误信息:错误Failedtocreatesess......
  • springsession 配置redis集群
    SpringSession配置Redis集群教程1.流程概述在本教程中,我们将详细介绍如何使用SpringSession来配置Redis集群。整个流程可以总结为以下几个步骤:添加SpringSession和Redis依赖配置Redis集群连接信息配置SpringSession使用Redis集群测试SpringSession与Redis集群的连接......
  • springcloud- 分布式session,全局session共享的解决方案
     1.导入依赖     <dependency>       <groupId>org.springframework.session</groupId>       <artifactId>spring-session-data-redis</artifactId> <!--     <version>2.3.0.RELEASE</version>-->......
  • session有效期内登录
    fromdjango.utils.deprecationimportMiddlewareMixinfromdjango.shortcutsimportrender,redirectclassMyMiddleware(MiddlewareMixin):defprocess_request(self,request):path=["/Login","/register"]print(request.path_inf......
  • php cookie与session
    1、cookie1.1创建cookiesetcookie(name,value,expire,path,domain);注释:在发送cookie时,cookie的值会自动进行URL编码,在取回时进行自动解码。(为防止URL编码,请使用setrawcookie()取而代之。)setcookie("user","runoob",time()+3600);1.2获取cookie//输出coo......
  • session设置源码
    setting中的SessionMiddleware必须设置 查看中间件源码 如果后面在试图函数使用request.session=像 SessionStore()这个函数中传递了Cookie如果视图函数定义了如下方法 执行clear清空_session_cache 至此process_request结束查看process_response下面两......
  • 解决非同源跨域不带cookie问题(原生、axios、fetch写法)
    原生js写法varxhr=newXMLHttpRequest();xhr.open('GET','http://localhost:7001/api/userinfo',true);xhr.withCredentials=true;//开启withCredentialsxhr.onreadystatechange=function(){if(xhr.readyState==4&&xhr.stat......
  • session 数据库引擎
     如果将setting中的session引擎配置为dbsessionapp的migtaions文件夹中已经包含makemigration数据只需要执行pythonmanage.pymigrate命令这时便会自动创建django_session1的表......
  • Session的使用
     基本配置1.设置sessionsetting.pyapp部分 全局默认配置部分 SESSION_ENGINE="django.contrib.sessions.backends.db"#存储在数据库中SESSION_ENGINE="django.contrib.sessions.backends.file"SESSION_FILE_PATH='sess'#存储在文件中 将配置复制进自己......
  • 封装RedisTemplate工具类
    packagecom.juxi.common.redis.service;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.data.redis.core.*;importorg.springframework.stereotype.Component;importjava.time.Duration;importjava.util.*;importja......