当前位置: 首页 > news >正文

SSO 基于token vue + element ui spring boot前端分离

一、项目启动

根据sql语句生成server库和客户端库

1.后端启动

配置修改:

spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    username: username
    password: password
    url: jdbc:mysql://ip:port/spike_sso?autoReconnect=true&allowMultiQueries=true&useUnicode=true&characterEncoding=UTF8&useSSL=false&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai

xxl:
  sso:
    redis:
      address: redis://:password@ip:port/0
      expire:
        minute: 1440

server启动运行 SpikeSsoApplication.java 默认端口9090

client  启动运行 SpikeApplication.java 默认端口9091

2.前端nginx配置

二、项目详解

1.后端代码

XxlSsoConfig.java

import com.xxl.sso.core.conf.Conf;
import com.xxl.sso.core.filter.XxlSsoTokenFilter;
import com.xxl.sso.core.util.JedisUtil;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author xuxueli 2018-11-15
 */
@Configuration
public class XxlSsoConfig implements DisposableBean {


    @Value("${xxl.sso.server}")
    private String xxlSsoServer;

    @Value("${xxl.sso.logout.path}")
    private String xxlSsoLogoutPath;

    @Value("${xxl.sso.redis.address}")
    private String xxlSsoRedisAddress;

    @Value("${xxl-sso.excluded.paths}")
    private String xxlSsoExcludedPaths;


    @Bean
    public FilterRegistrationBean xxlSsoFilterRegistration() {

        // xxl-sso, redis init
        JedisUtil.init(xxlSsoRedisAddress);

        // xxl-sso, filter init
        FilterRegistrationBean registration = new FilterRegistrationBean();

        registration.setName("XxlSsoTokenFilter");
        registration.setOrder(1);
        registration.addUrlPatterns("/*");
        registration.setFilter(new XxlSsoTokenFilter());
        registration.addInitParameter(Conf.SSO_SERVER, xxlSsoServer);
        registration.addInitParameter(Conf.SSO_LOGOUT_PATH, xxlSsoLogoutPath);
        registration.addInitParameter(Conf.SSO_EXCLUDED_PATHS, xxlSsoExcludedPaths);

        return registration;
    }

    @Override
    public void destroy() throws Exception {

        // xxl-sso, redis close
        JedisUtil.close();
    }

}

2.前端代码

axios 拦截器配置

配置 返回501跳转

import axios from "axios";
import { Message } from 'element-ui';
// 创建 axios 实例

// 添加请求拦截器
axios.interceptors.request.use(function (config) {
    // 在发送请求之前做些什么
    let token = localStorage.getItem("token");
    if (token != null && token != 'null') {
        config.headers["xxl_sso_sessionid"] = token;
    }
    return config;
}, function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
});

// 添加响应拦截器
axios.interceptors.response.use(function (response) {
    // 2xx 范围内的状态码都会触发该函数。
    // 对响应数据做点什么
    if (response.data.code == 501) {
        window.location.href="/login";
    }
    return response;
}, function (error) {
    let status = error.response.status;
    if (403 == status) {
        Message.error("未登录");
        let returnUrl = localStorage.getItem("returnUrl");
        // if (returnUrl != 'null') {
        //     window.location.href="/login?returnUrl="+returnUrl;
        // }else {
            window.location.href="/login";
        // }
        //this.$router.push("/");
    }
    // 超出 2xx 范围的状态码都会触发该函数。
    // 对响应错误做点什么
    return Promise.reject(error);
});

export {axios as axios };

preLogin.vue处理跳转

let returnUrl = this.$route.query.returnUrl;
      localStorage.removeItem("returnUrl");
      if (returnUrl != undefined && returnUrl !=null && returnUrl != 'null') {
        localStorage.setItem("returnUrl",returnUrl);
      }
      // 查看sso server是否登录,如果登录带着token返回
      let token = localStorage.getItem("token");
      if (token != 'null') {
        // 校验登录
        logincheck(token).then(res=>{
          if (res.data.data != null) {
              window.location.href=returnUrl+"?token="+token;
          }else {
              window.location.href="/login?returnUrl="+returnUrl;
          }
        }).catch((err) => {
        })
        .finally(() => {

        });
      } else {
          window.location.href="/login?returnUrl="+returnUrl;
      }

三、代码地址

注意事项: 

客户端需要修改SSO 登录地址

在线demo

server: SSO SERVER

client: SPIKE SERVICE

github: https://github.com/katriina-tavi/spike

gitee: spike: 前端分离实现单点登录 vue element springboot xxl-sso实现

相关文章:

  • pandas:jupyter notebook笔记(更新中)
  • 牛客网刷题——JAVA
  • Tpflow V6.0.8 正式版发布
  • 中缀转后缀表达式(思路分析) [数据结构][Java]
  • WhatsApp Business 与 Google My Business:它们的运作方式和不同之处
  • 【网络】网络基础知识点(MAC、IP、通讯模式、通信方式、集线器、交换机、路由器、冲突域/广播域、ARP、VLAN等)
  • Windows 应用商店无法打开解决办法
  • Jupyter Notebook与Pycharm代码在Docker容器中运行
  • 【组成原理-IO系统】IO控制方式
  • JAVA毕业设计的工资管理系统计算机源码+lw文档+系统+调试部署+数据库
  • OBS 安装与考试参数设置及屏幕无法完全捕获、录屏不完整的解决方法
  • 交通运输行业经销商渠道管理系统高效协同,提高便捷化水平
  • Linux编写脚本使用Docker部署项目
  • 1205、mysql视图、mysql存储过程
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • 3.7、@ResponseBody 和 @RestController
  • docker python 配置
  • docker-consul
  • golang 发送GET和POST示例
  • HomeBrew常规使用教程
  • java 多线程基础, 我觉得还是有必要看看的
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • mockjs让前端开发独立于后端
  • PHP变量
  • vue 配置sass、scss全局变量
  • 阿里云Kubernetes容器服务上体验Knative
  • 分布式熔断降级平台aegis
  • 组复制官方翻译九、Group Replication Technical Details
  • #QT(智能家居界面-界面切换)
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (二)PySpark3:SparkSQL编程
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (三)elasticsearch 源码之启动流程分析
  • (三分钟)速览传统边缘检测算子
  • (十八)SpringBoot之发送QQ邮件
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • .NET MVC之AOP
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .NET/C# 检测电脑上安装的 .NET Framework 的版本
  • [ vulhub漏洞复现篇 ] AppWeb认证绕过漏洞(CVE-2018-8715)
  • [AS3]URLLoader+URLRequest+JPGEncoder实现BitmapData图片数据保存
  • [C# WPF] DataGrid选中行或选中单元格的背景和字体颜色修改
  • [c++] 什么是平凡类型,标准布局类型,POD类型,聚合体
  • [CodeForces-759D]Bacterial Melee
  • [CSS]CSS 字体属性
  • [IE编程] 了解Urlmon.dll和Wininet.dll
  • [LeetCode][138]【学习日记】深拷贝带有随机指针的链表
  • [leveldb] 2.open操作介绍
  • [na]wac无线控制器集中转发部署的几种情况
  • [NOIP2017 提高组] 列队 题解
  • [SoftGrid 系列] Microsoft SoftGrid Server 安装篇
  • [Swift]RxSwift常见用法详解