单点登录(简单的实现)

2023-11-04

假设现在有两个域名,分别为:(分别记为client1、client2)

client1.com
client2.com

一个认证服务器,域名:

ssoserver.com

client1、client2都需要登陆后才能访问到数据,现在想要实现client1登录了,再去访问client2不需要登录

简单实现:

  1. C:\Windows\System32\drivers\etc\HOSTS中配置需要用的三个域名:
    127.0.0.1 ssoserver.com
    127.0.0.1 client1.com
    127.0.0.1 client2.com
    

在这里插入图片描述

  1. 现在设老师、学生需要登录后才能访问到具体数据:

老师:

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

@Controller
public class Client1Controller {
    @GetMapping("/teacher")
    public String getData(HttpServletRequest request, @RequestParam(required = false) String token, HttpSession session, Model model) {
        if (token != null) {
            //说明刚刚登录,获取到了token
            session.setAttribute("admin", token);
        }

        Object admin = session.getAttribute("admin");
        if (admin != null) {
            //说明登陆过了
            String teacher = request.getServerName() + " -> 老师的数据xxx";
            model.addAttribute("msg", teacher);
            return "teacher";
        }

        //未登录,去登陆
        return "redirect:http://ssoserver.com:8080/login?redirect_url=http://client1.com:8080/teacher";
    }
}

学生:


import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

@Controller
public class Client2Controller {
    @GetMapping("/student")
    public String getData(HttpServletRequest request, HttpSession session, Model model, @RequestParam(required = false) String token) {
        if (token != null) {
            session.setAttribute("admin", token);
        }

        Object admin = session.getAttribute("admin");
        if (admin != null) {
            String student = request.getServerName() + " -> 学生的数据xxx";
            model.addAttribute("msg", student);
            return "student";
        }

        return "redirect:http://ssoserver.com:8080/login?redirect_url=http://client2.com:8080/student";
    }
}

实现的比较简单:

  • 首先判断是否有token,如果有,说明是从认证服务器跳转过来的,那么把数据存到session,之后当前域名再访问就不用去认证了;
  • 再判断session,如果session中有数据,说明已经登录;
  • 最后如果都没数据,去认证服务器认证,这里需要注意要带上跳转回来的url,否则认证完不知道去哪了。

3.认证服务器

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;

/**
 * @program: gulimall
 * @description:
 * @author: liangjiayy
 * @create: 2022-06-17 21:59
 **/
@Controller
@Slf4j
public class SSOServerController {
    /**
     * 登录逻辑
     */
    @PostMapping ("/login")
    public String login(String username,
                        String password,
                        String url,
                        HttpServletResponse response) {

        log.info("用户名:{},密码:{},登陆成功,带token跳转回原网页!",username,password);

        Cookie cookie=new Cookie("sso_token",username);
        response.addCookie(cookie);
        return "redirect:" + url + "?token=" + username;
    }

    @GetMapping ("/login")
    public String login(@RequestParam(value = "redirect_url",required = false) String url,
                        Model model,
                        @CookieValue(value = "sso_token",required = false) String token){
        if (!StringUtils.isEmpty(token)) {
            //说明最近登录过,直接返回
            return "redirect:" + url + "?token=" + token;
        }

        if (!StringUtils.isEmpty(url)) {
            model.addAttribute("url",url);
        }

        return "login";
    }
}

本文单点登录的核心在:

Cookie cookie=new Cookie("sso_token",username);
response.addCookie(cookie);

即如果登录了,则把登录的信息(用户名)存到cookie中,当用户再次访问当前服务器,回首先看cookie中有没有登录的用户信息,如果有,则不需要再登录,就实现了单点登录。

  1. 效果图:
  • 访问http://client1.com:8080/teacher
    在这里插入图片描述
    任意填上数据,点登录
    在这里插入图片描述
    如图:登录成功
    在这里插入图片描述

  • 现在我们去访问http://client2.com:8080/student,发现不用填写登录信息,就已经登陆上了
    在这里插入图片描述

附html页面:

  • teacher.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/login" method="post">
    用户名:<input name="username">
    密  码:<input name="password">
    <input name="url" hidden th:value="${url}">
    <input type="submit" value="登录">
</form>
</body>
</html>
  • student.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>student</title>
</head>
<body>
你好,<div th:text="${session.admin}"></div>
获取到学生的数据:<br>
<div th:text="${msg}"></div>
</body>
</html>
  • teacher.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>teacher</title>
</head>
<body>
你好,<div th:text="${session.admin}"></div>
获取到老师的数据:<br>
<div th:text="${msg}"></div>
</body>
</html>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单点登录(简单的实现) 的相关文章

随机推荐

  • 0、Spring工程构建&Spring快速入门&Spring配置文件详解&注入&Sprint相关API

    1 Spring工程构建 创建工程项目目录文件夹 IDEA选择项目new一个module 配置案例 aop创建 创建并下载完毕后 点击file选择projert 选择按照的jdk版本 output选择当前目录 点击右下方apply 选择fa
  • Android BottomNavigationView的属性设置

    底部导航栏通常是每个item由一个icon和title组成的 然后再控制下是否点击的状态即可 当然也可以使用官方在support包内提供的BottomNavigationView来实现 于简单的需求来说 使用BottomNavigation
  • FPGA数字IC刷题58道Verilog题解代码及视频讲解【FPGA探索者】【同步/异步FIFO】【跨时钟】

    牛客 Verilog 刷题入门篇1 24 进阶篇1 34 题解代码 所有代码均能通过测试 配合视频讲解效果更佳 为避免内容冗余 本文只给出代码 部分题目给出必要说明 很多题目本身出题有些问题 着重理解题目 没必要钻牛角尖 本文作者 FPGA
  • 贪心算法之活动安排问题(填表详解+思路解析)

    贪心算法 总是选择当前看起来最优的选择 局部最优解 得到的结果是一个整体最优解 但是总是选择局部最优解并不总是能得到整体最优解 需要在问题具有 贪心选择性和优化子结构时才成立 贪心选择性 第一次做出贪心选择是正确的 优化子结构 第一次做完贪
  • Tarjan 强连通分量算法的 Java 实现

    强连通分量算法是图论中的一个重要算法 用于将有向图分解为若干个强连通分量 Tarjan 算法是其中一种常用的实现方式 它可以高效地找到图中的所有强连通分量 本文将介绍 Tarjan 强连通分量算法的 Java 实现 并提供相应的源代码 首先
  • 万用表的使用

    deprecate 反对 轻视 declaration 宣告 声明书 宣布 宣告 申报 arg argue 争论 论证 争辩 主张 认为 提供证据 证明 表明 原因等 type 类型 种类 打字 成为 的典型 function 功能 作用
  • [721]linux安装kafka及命令行使用

    文章目录 一 安装kafka 二 解压kafka 三 修改server properties文件 四 修改zookeeper properties文件 五 添加kafka启动脚本 六 启动kafka 七 命令行使用kafka 创建topic
  • Vue知识系列(4)每天10个小知识点

    目录 系列文章目录 Vue知识系列 1 每天10个小知识点 Vue知识系列 2 每天10个小知识点 Vue知识系列 3 每天10个小知识点 知识点 31 Vuex 四种属性的概念 作用 使用示例 32 Vuex 和单纯的全局对象 的概念 作
  • Linux磁盘分区和文件系统的关系

    一 Linux磁盘相关命令及作用 1 df命令 用于显示文件系统的磁盘空间使用情况 2 du命令 用于查看文件或目录的磁盘使用情况 3 fdisk命令 用于磁盘分区表的创建和管理 4 mkfs命令 用于创建文件系统 5 mount命令 用于
  • 华北电力计算机专业排名,华电考研计算机专业排名

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 1354计算机软件与理论359 1355计算机软件与理论340 1356计算机软件与理论334 1357计算机软件与理论329 1358计算机软件与理论326 1359计算机软件与理论324 1
  • C++/C++11中引用的使用

    引用 reference 是一种复合类型 compound type 引用为对象起了另外一个名字 引用类型引用 refer to 另外一种类型 通过将声明符写成 d的形式来定义引用类型 其中d是声明的变量名 一 一般引用 一般在初始化变量时
  • Cocos2dx on Qt

    讨论贴在这里 http www cocos2d x org boards 6 topics 8043 page 1 准备 glew 库 bin glew32 dll gt windows system32 include GL gt VC
  • STM32F103时钟配置流程

    知识点 系统复位后 HSI振荡器被选为系统时钟 当时钟源被直接或通过PLL间接作为系统时钟时 它将不能被停止 STM32F103的三个可以作为系统时钟的时钟源 分别是HSI HSE PLL 而PLL的时钟源是HSI 2 内部RC振荡器二分频
  • 华硕计算机cpu怎么超频怎么设置,内存和CPU超频操作_华硕 ROG Rampage VI Apex_主板评测-中关村在线...

    进阶操作 进BIOS可能很多人都是为了去给CPU和内存进行超频 首先按F7进入到高级模式 华硕的主板选择Extreme Tweaker选项卡 有的主板是AI Tweaker或者超频设置等名字 Extreme Tweaker选项卡 内存超频
  • 如何使用postman做接口测试

    常用的接口测试工具主要有以下几种 Postman 简单方便的接口调试工具 便于分享和协作 具有接口调试 接口集管理 环境配置 参数化 断言 批量执行 录制接口 Mock Server 接口文档 接口监控等功能 JMeter 开源接口测试及压
  • Python中is和==(is not和!=)的区别

    Python中有很多种运算符 本文主要记录一下is和 这两种运算符的区别 id 函数是查看该对象所在内存地址 每个对象都有对应的内存地址 如 is 用于判断两个变量引用对象是否为同一个 用于判断引用变量的值是否相等 类似于Java中的equ
  • 华为OD机试 - 按单词下标区间翻转文章内容(Java)

    题目描述 给定一段英文文章片段 由若干单词组成 单词间以空格间隔 单词下标从0开始 请翻转片段中指定区间的单词顺序并返回翻转后的内容 例如给定的英文文章片段为 I am a developer 翻转区间为 0 3 则输出 developer
  • HJ26 字符串排序

    Powered by NEFU AB IN Link 文章目录 HJ26 字符串排序 题意 思路 代码 HJ26 字符串排序 题意 编写一个程序 将输入字符串中的字符按如下规则排序 规则 1 英文字母从 A 到 Z 排列 不区分大小写 如
  • PCL 计算点云法向量并显示

    目录 一 算法原理 1 法向量估计 2 法向量定向 3 表面曲率 4 参考文献 5 法向量定向的理解 6 CloudCompare 二 pcl Normal的定义 三 pcl Normal的几种输出方式 四 计算法线并显示 1 计算输入点云
  • 单点登录(简单的实现)

    假设现在有两个域名 分别为 分别记为client1 client2 client1 com client2 com 一个认证服务器 域名 ssoserver com client1 client2都需要登陆后才能访问到数据 现在想要实现cl