IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 手撸SSO单点登录(五)登录验证-OA系统页面刷新或者跳转新OA系统页面 -> 正文阅读

[Java知识库]手撸SSO单点登录(五)登录验证-OA系统页面刷新或者跳转新OA系统页面

目标

?上一章节手撸SSO单点登录(四)登录验证-首次登录已经成功登陆并且跳转至OA系统,当OA系统刷新,或者OA系统打开其他菜单是怎么实现无需登陆,直接验证通过,跳转页面或者刷新页面。
视频详细讲解请见https://www.bilibili.com/video/BV1b5411d7be/
代码下载地址

二 、系统UML工程类图

在这里插入图片描述

三、代码实现

a.当刷新OA系统页面的时候,进入com.yuantai.filter.LoginFilter请求拦截、进入isAccessAllowed方法

@Override
    public boolean isAccessAllowed(HttpServletRequest request, HttpServletResponse response) throws IOException {
        SessionAccessToken sessionAccessToken = SessionUtils.getAccessToken(request);
        // 本地Session中已存在,且accessToken没过期或者refreshToken成功,直接返回
        if (sessionAccessToken != null && (!sessionAccessToken.isExpired()
                || refreshToken(sessionAccessToken.getRefreshToken(), request))) {
            return true;
        }
        String code = request.getParameter(Oauth2Constant.AUTH_CODE);
        if (code != null) {
            // 获取accessToken
            getAccessToken(code, request);
            // 为去掉URL中授权码参数,再跳转一次当前地址
            redirectLocalRemoveCode(request, response);
        }
        else {
            redirectLogin(request, response);
        }
        return false;
    }

因之前已经登陆过,所以SessionUtils.getAccessToken(request) 取值不为空,进去到

if (sessionAccessToken != null && (!sessionAccessToken.isExpired()
                || refreshToken(sessionAccessToken.getRefreshToken(), request))) {
            return true;
}

?当sessionAccessToken.isExpired()没有过期 或者刷新refreshToken(sessionAccessToken.getRefreshToken(), request))成功返回true,认证通过,进入com.yuantai.controller.IndexController"/"GET请求返回请求成功index页面

b.如果sessionAccessToken.isExpired()过期,我们需要调用refreshToken(sessionAccessToken.getRefreshToken(), request))刷新token成功才会返回true。

protected boolean refreshToken(String refreshToken, HttpServletRequest request) {
        Result<RpcAccessToken> result = Oauth2Utils.refreshToken(getServerUrl(), getAppId(), refreshToken);
        if (!result.isSuccess()) {
            logger.error("refreshToken has error, message:{}", result.getMessage());
            return false;
        }
        return setAccessTokenInSession(result.getData(), request);
    }

?可以看到Oauth2Utils.refreshToken(getServerUrl(), getAppId(), refreshToken);这里是向认证中心请求token 刷新我们当做token 刷新成功(如果刷新不成功将会认证失败直接跳转到SSO统一登录页面,需要再次登录验证)。

接着调用 setAccessTokenInSession(result.getData(), request);把登录信息存储到session中,记录session与token的映射关系(这里与手撸SSO单点登录(四)登录验证-首次登录根据临时授权码code获取登录信息后的流程一样)

private boolean setAccessTokenInSession(RpcAccessToken rpcAccessToken, HttpServletRequest request) {
        if (rpcAccessToken == null) {
            return false;
        }
        // 记录accessToken到本地session
        SessionUtils.setAccessToken(request, rpcAccessToken);

        // 记录本地session和accessToken映射
        recordSession(request, rpcAccessToken.getAccessToken());
        return true;
    }

总结
刷新页面,或者打开新的页面,无非就是带着登录后的信息去后台请求接口,第一步先去验证是否通过,验证通过则继续接口调用,验证不通过直接跳转至SSO统一登录页面。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-05-09 12:26:14  更:2022-05-09 12:28:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 23:51:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码