SSO单点登录简单实现

SSO单点登录简单实现通过 cookie 来实现单点登录 1 单点登录的流程 cookie 是用来在客户端存储数据的工具 在其中一个子系统登录 跳转到登录系统 登陆系统登陆完成 完成登录后会向发起登录的子系统写入一个 cookie 保存用于认证用户是否登录的信息 token 其他子系统向服务器发起请求的时候 携带这个 cookie 完成登录 cookie 的域要是所有子系统相同的域 这样所有子系统才能访问到这个 cookie 2 单点登录流程图 2 单点登录的编码 部分核心代码 代码链接 https gitee com yueh

通过cookie来实现单点登录

1.单点登录的流程

2.单点登录流程图

在这里插入图片描述

2.单点登录的编码(部分核心代码)

代码链接:https://gitee.com/yuehewei/sso-single-sign-on

@Controller @RequestMapping("/login") public class LoginController { //模拟数据库数据 private static Set<User> dbUsers; static { dbUsers=new HashSet<>(); dbUsers.add(new User(0,"yuehwi","")); dbUsers.add(new User(1,"yueei1","")); dbUsers.add(new User(2,"yueei2","12345")); dbUsers.add(new User(3,"yueei3","1234")); dbUsers.add(new User(4,"yueh4","123")); } @PostMapping public String doLogin(User user, HttpSession session, HttpServletResponse response){ Object target = session.getAttribute("target"); //判读这个用户是否存在 Optional<User> user1 = dbUsers.stream().filter(dbUsers -> dbUsers.getUsername().equals(user.getUsername()) && dbUsers.getPassword().equals(user.getPassword()) ).findFirst(); /* * 1.当这个用户存在,我们需要给他生成一个随机的uuid作为token * 2.并把token作为key,user作为value,存在缓存中 * 3.并把token交割cookie,并设置该cookie可跨域的域名 * 4.将cookie返还给客户端 */ if (user1.isPresent()){ String token = UUID.randomUUID().toString(); LoginCacheUtil.loginMap.put(token,user1.get()); Cookie cookie = new Cookie("TOKEN",token); //跨域共享cookie的方法:setDomain() cookie.setDomain("codeshop.com"); response.addCookie(cookie); }else { session.setAttribute("msg","用户名或者密码错误"); return "login"; } return "redirect:"+target; } @GetMapping("info") @ResponseBody /* *功能描述 * 得到token,并在缓存中找到key=token的用户并返回 */ public ResponseEntity<User> getUserInfo(String token){ if (!StringUtils.isEmpty(token)){ User user = LoginCacheUtil.loginMap.get(token); return ResponseEntity.ok(user); }else { return new ResponseEntity<>(null, HttpStatus.BAD_REQUEST); } } } 
@Controller @RequestMapping("view") public class ViewController { @Autowired //RestTemplate 是从 Spring3.0 开始支持的一个 HTTP 请求工具,它提供了常见的REST请求方案的模版 RestTemplate restTemplate; private final String LOGIN_INFO="http://login.codeshop.com:9000/login/info?token="; @GetMapping ("index") public String toIndex(@CookieValue(required = false,value = "TOKEN") Cookie cookie, HttpSession session){ //判断用户是否登陆过,RestTemplate 发送的是Http请求,getForObject 的返回值就是服务提供者返回的数据,使用getForObject 无法获取到响应头 if ( cookie!=null){ String token = cookie.getValue(); if (!StringUtils.isEmpty(token)){ Map user = restTemplate.getForObject(LOGIN_INFO +token, Map.class); session.setAttribute("loginUser",user); } } return "index"; } } 

参考视频链接:https://space.bilibili.com/

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/233268.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Intellij Idea 主题下载(Eclectide Monokai)

    Intellij Idea 主题下载(Eclectide Monokai)从国外大神的博客上找的一个很棒的主题EclectideMonoka,感觉是在Durcula上做了很多优化,是黑色主题的升级版,通过一周的使用感觉非常爽,对方法、变量的高亮以及选中的显示等等色彩搭配挺好,分享一下

    2022年5月31日
    133
  • 局域网广域网城域网的英文_城域网是内网还是外网

    局域网广域网城域网的英文_城域网是内网还是外网局域网定义:局域网是将小区域内的各种通信设备互连在一起的通信网络目前常见的局域网类型包括:以太网(Ethernet)、光纤分布式数据接口(FDDI)、异步传输模式(ATM)、令牌环网(TokenRing)、交换网Switching等,它们在拓朴结构、传输介质、传输速率、数据格式等多方面都有许多不同。局域网的典型特性:高速据率(0.1M~100Mbps),短距离(0.1km~2

    2022年10月19日
    5
  • c++开源库rapidxml介绍与示例

    c++开源库rapidxml介绍与示例官方地址:http://rapidxml.sourceforge.net/官方手册:http://rapidxml.sourceforge.net/manual.html也可以在github上下载到别人上传的rapidxml:https://github.com/dwd/rapidxml1.头文件一般我们用到的头文件只有这三个#include”rapidxml/rapidxml.hpp”

    2022年7月17日
    19
  • Landsat 8 地表反射率数据介绍—— Landsat 8 Surface Reflectance Tier 1

    Landsat 8 地表反射率数据介绍—— Landsat 8 Surface Reflectance Tier 1USGSLandsat8SurfaceReflectanceTier1该数据集是来自Landsat8OLI/TIRS传感器的经大气校正的表面反射率。图像包含4个可见光和一个近红外(VNIR)波段和2个短波红外(SWIR)波段两个热红外。经过正射校正后的表面反射率,以及2个热红外经过正交校正后的亮度温度这些数据已使用LaSRC进行了大气校正,包括使用CFMASK生成的云,阴影…

    2022年7月23日
    38
  • java版微信公众号开发(二):配置token

    java版微信公众号开发(二):配置token

    2021年6月9日
    152
  • 软件测试经典面试题(小题汇总)[通俗易懂]

    整理收集一些大家的题,自己来作答,回答不妥或者不全的还请大家指正网络(一)简单描述下TCP协议TCP:传输控制协议,是传输层通信协议。它有面向连接、可靠、字节流传输等特点TCP建立连接时,需要三次握手协议TCP三次握手的过程如下:客户端发送SYN保温给服务端,进入SYN_SEND(SEQ=X)状态服务端收到SYN保温,回应一个SYN(SEQ=Y)ACK(ACK=X+1)报文,进入…

    2022年4月13日
    36

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号