单点登录SSO
SSO(Single Sign On)单点登录
通过cookie实现单点登录
cookie是存储在客户端的数据工具。
1、单点登录流程
在其一个子系统登录,跳转到登录系统,登录系统完成登录,完成登录过后向发起登录的子系统写入一个cookie,保存用于认证用户是否登录的信息(token)其他的子系统要能访问到这个cookie,在其他子系统向服务器发起请求的时候,携带这个cookie完成登录。
cookie的域要是所有子系统相同的域,这样所有的子系统才能访问的到这个cookie。
需求:
商店首页页面:www.canshop.com,9010
VIP系统:www.vip.canshop.com, 9011
购物车系统:www.cart.canshop.com,9012
登录系统:www.login.canshop.com。9000
2、代码编写
创建1个父工程sso-use-cookie
和四个子工程sso-cart
,sso-login
、sso-main
、sso-vip
;
其中cart、login、main都是主页,都要通过login登录
在父工程中配置依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.can</groupId>
<artifactId>sso-use-cookie</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>sso-main</module>
<module>sso-vip</module>
<module>sso-cart</module>
<module>sso-login</module>
</modules>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
</dependencies>
<!-- 编译控制 -->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
配置完后
编写login工程
登录页面
application.yml配置
启动类
实体类
Controller
package com.can.login.controller;
import com.can.login.pojo.User;
import com.can.login.utils.LoginCacheUtil;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.thymeleaf.util.StringUtils;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.*;
@Controller
@RequestMapping("/login")
public class LoginController {
private static Set<User> doUsers;
// 模拟数据
static{
doUsers = new HashSet<>();
doUsers.add(new User(0,"张三","123456"));
doUsers.add(new User(1,"lisi","123456"));
doUsers.add(new User(2,"can","123456")