单点登录基于Cookie开发思路整理

简介: 单点登录基于Cookie开发思路整理

有四个系统:

sso-main 首页系统
sso-cart 购物车系统        
sso-vip  vip系统
sso-login 登录系统

1、建一个maven管理的父子依赖项目

2、逻辑说明

首次登录情况:
(1)无论要访问哪一个系统,都需要先登录,也就是需要先请求访问 登录系统sso-login。
(2)访问sso-login登录系统时,记得带上 来源系统的地址,这样就知道到底是从哪个系统请求来的。
<span>
    <a th:if="${session.loginUser == null}" href="http://login.codeshop.com:9000/view/login?target=http://www.codeshop.com:9010/view/index">登录</a>
</span>
(3)提交用户信息表单请求之后,判断用户名密码是否存在,不存在则跳转回登录页面,如果存在,那么生成token,生成方式自定义,这里采用 UUID.randomUUID().toString(),然后设置cookie的域名,将token存放到cookie中,并将token和用户信息缓存到map中,然后重定向到目标页面
String token = UUID.randomUUID().toString();
Cookie cookie = new Cookie("TOKEN",token);
cookie.setDomain("codeshop.com");
response.addCookie(cookie);
LoginCache.loginUser.put(token,user);
//缓存map
public class LoginCache {
    public static Map<String, User> loginUser = new HashMap<>();
}
(4)登录系统sso-login 还需要提供一个对外接口,根据token获取用户信息,方便子系统获取用户信息
@GetMapping("info")
    @ResponseBody
    public ResponseEntity<User> getUserInfo(String token){
        if (!StringUtils.isEmpty(token)){
            User user = LoginCache.loginUser.get(token);
            return ResponseEntity.ok(user);
        }else{
            return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
        }
    }
(5)提交用户信息成功之后,重定向目标页面,比如sso-main,这个时候,会先判断cookie是否为空,是否包含token,如果包含,那么根据token远程调用接口,获取用户信息,并将用户信息存入session中
@Autowired
    private RestTemplate restTemplate;
    private final String LOGIN_INFO_ADDRESS = "http://login.codeshop.com:9000/login/info?token=";
    @GetMapping("/index")
    public String toIndex(@CookieValue(required = false,value = "TOKEN") Cookie cookie, HttpSession session){
        if (cookie != null){
            String token = cookie.getValue();
            if (!StringUtils.isEmpty(token)){
                Map map = restTemplate.getForObject(LOGIN_INFO_ADDRESS + token, Map.class);
                session.setAttribute("loginUser",map);
            }
        }
        return "index";
    }
(6)打开目标页面,从session中获取用户信息,判断是否为登录,
<h1>欢迎来到main code shop</h1>
<span>
    <a th:if="${session.loginUser == null}" href="http://login.codeshop.com:9000/view/login?target=http://www.codeshop.com:9010/view/index">登录</a>
    <a th:unless="${session.loginUser == null}" href="#">退出</a>
</span>
<p th:unless="${session.loginUser == null}">
    <span style="color: deepskyblue;" th:text="${session.loginUser.username}"></span> 已登录
</p>
</body>
</html>

3、非首次登录

(1)当需要访问sso-main主系统页面时,会先判断cookie是否为空,不为空,取出token,根据token调用外部接口,获取用户信息,直接登录
在这里插入代码片
public class ViewController {
    @Autowired
    private RestTemplate restTemplate;
    private final String LOGIN_INFO_ADDRESS = "http://login.codeshop.com:9000/login/info?token=";
    @GetMapping("/index")
    public String toIndex(@CookieValue(required = false,value = "TOKEN") Cookie cookie, HttpSession session){
        if (cookie != null){
            String token = cookie.getValue();
            if (!StringUtils.isEmpty(token)){
                Map map = restTemplate.getForObject(LOGIN_INFO_ADDRESS + token, Map.class);
                session.setAttribute("loginUser",map);
            }
        }
        return "index";
    }
}

最后总结

1、必须要设置cookie的domain域名值

2、host文件中映射的域名要一致

127.0.0.1 www.codeshop.com
127.0.0.1 vip.codeshop.com
127.0.0.1 cart.codeshop.com
127.0.0.1 login.codeshop.com


相关文章
|
2月前
|
存储 安全 关系型数据库
安全开发-PHP应用&留言板功能&超全局变量&数据库操作&第三方插件引用&后台模块&Session&Cookie&Token&身份验证&唯一性
安全开发-PHP应用&留言板功能&超全局变量&数据库操作&第三方插件引用&后台模块&Session&Cookie&Token&身份验证&唯一性
|
2月前
|
安全 网络安全 API
kotlin安卓开发JetPack Compose 如何使用webview 打开网页时给webview注入cookie
在Jetpack Compose中使用WebView需借助AndroidView。要注入Cookie,首先在`build.gradle`添加WebView依赖,如`androidx.webkit:webkit:1.4.0`。接着创建自定义`ComposableWebView`,通过`CookieManager`设置接受第三方Cookie并注入Cookie字符串。最后在Compose界面使用这个自定义组件加载URL。注意Android 9及以上版本可能需要在网络安全配置中允许第三方Cookie。
278 0
|
3月前
|
存储 缓存 安全
【PHP开发专栏】PHP Cookie与Session管理
【4月更文挑战第30天】本文介绍了PHP中的Cookie和Session管理。Cookie是服务器发送至客户端的数据,用于维持会话状态,可使用`setcookie()`设置和`$_COOKIE`访问。Session数据存于服务器,更安全且能存储更多数据,通过`session_start()`启动,`$_SESSION`数组操作。根据需求选择Cookie(跨会话共享)或Session(单会话存储)。实战中常组合使用,如Cookie记住登录状态,Session处理购物车。理解两者原理和应用场景能提升Web开发技能。
43 2
|
3月前
|
存储 缓存 JSON
【Web开发】会话管理与无 Cookie 环境下的实现策略
【Web开发】会话管理与无 Cookie 环境下的实现策略
|
3月前
|
存储 安全 Java
理解Session和Cookie:Java Web开发中的用户状态管理
【4月更文挑战第3天】本文探讨了Web应用中用户状态管理的两种主要机制——Session和Cookie。Session在服务器端存储数据,更安全,适合大量数据,而Cookie存储在客户端,可能影响性能但支持持久化。在Java Web开发中,使用Servlet API操作Session和Cookie,注意敏感信息安全、Session管理及Cookie安全设置。理解两者差异并恰当使用是优化应用性能和用户体验的关键。
74 1
|
3月前
|
存储 搜索推荐 安全
Java Web开发中的会话管理:Cookie与Session对比
Java Web开发中的会话管理:Cookie与Session对比
|
3月前
|
存储 搜索推荐 安全
【Web开发】cookie和session
【Web开发】cookie和session
|
10月前
|
存储 设计模式 JavaScript
掌握JavaWeb开发的必备技能:Servlet、JSP、Cookie、Session、EL、JSTL详解 ~~~~B站老杜--Servlet-JSP-课堂笔记(三)
当某个特殊的事件发生(特殊的事件发生其实就是某个时机到了。)之后,被web服务器自动调用。 思考一个业务场景
62 0
|
10月前
|
缓存 前端开发 Java
掌握JavaWeb开发的必备技能:Servlet、JSP、Cookie、Session、EL、JSTL详解 ~~~~B站老杜--Servlet-JSP-课堂笔记(二)
我们只需要service方法,其他方法大部分情况下是不需要使用的。代码很丑陋。 适配器设计模式Adapter
51 0
|
10月前
|
前端开发 Java 应用服务中间件
掌握JavaWeb开发的必备技能:Servlet、JSP、Cookie、Session、EL、JSTL详解 ~~~~B站老杜--Servlet-JSP-课堂笔记(一)
对于一个动态的web应用来说,一个请求和响应的过程有多少个角色参与,角色和角色之间有多少个协议
65 0