1.登录业务介绍:

单一服务器模式
单一服务器模式用于登录的方式通常是使用session。
1.微服务

在分布式中通常使用单点登入(SSO(single sign on)模式)的方式实现用户登入,三种实现方式

1.1 session广播机制实现

在分布式中各个服务器都是独立运行,互不干涉,如果只是使用单个session的话那么每次打开一个服务器都需要重新输入信息登入,但是可以通过复制session的方式实现输入一次信息就可以登入多个服务器,但是缺点也很明显,服务器少还可以,如果服务器多,复制的session也就多,占用进程和浪费空间。以前使用,现在不推荐。

1.2 使用session+redis实现

实现过程:

当你在项目的任意模块登入时,数据将存储在两个地方

  1. redis:key: 生成唯一随机值 value:用户数据
  2. cookie:把redis生成的key放到cookie中

访问其他模块时,发送请求带着cookie进行发送,通过request获取cookie,再把获取的cookie到redis中进行查询即可。

1.3 使用令牌(token)

解释:通过一定的规则生成包含用户信息的字符串

实现过程:

  1. 当你在项目的任意模块登入后,生成相应的token,并返回

    • 通过cookie返回
    • 通过地址栏返回
  2. 每次访问其他模块时都会携带token,根据这个token获取用户信息,有则登入。

规则可以自定义也可以使用已封装好的,eg:JWT,HMAC(AK/SK)

2. JWT

2.1 什么是JWT?

JSON Web Tokens, 这是一个开放的标准,规定了一种Token实现方式,以JSON为格式.

2.2 JWT的组成
2.2.1 JWT头

描述JWT元数据的JSON对象,使用Base64 URL转换为字符串保存。

alg------》alg属性表示签名使用的算法

typ------》typ属性表示令牌的类型

{"alg": "HS256",  "typ": "JWT"
}
2.2.2 有效载荷

WT的主体内容部分,JSON对象,包含需要传递的数据,使用Base64 URL转换为字符串保存。

默认字段:

sub: 该JWT所面向的用户
iss: 该JWT的签发者
iat(issued at): 在什么时候签发的token
exp(expires): token什么时候过期
nbf(not before):token在此时间之前不能被接收处理
jti:JWT ID为web token提供唯一标识

自定义字段:不建议存放密码

{"name":"xioaxian"
}

注:Base64是一种编码不是一种加密过程

2.2.3 数字签名

再给上述拼接成的字符串进行加密之前,要在末尾加上数字签名,而签名的作用是防止抵赖以及防止数据被修改。数字签名则是使用密钥(secret)也可以叫私钥,这个密钥每个公司都有自己的生成方法,最后用HS256进行加密。

2.2.4 JWT的优点

通用:因为json的通用性,所以JWT是可以进行跨语言支持的,像JAVA,JavaScript,NodeJS,PHP等很多语言都可以使用。

紧凑:JWT的构成非常简单,字节占用很小,可以通过 GET、POST 等放在 HTTP 的 header 中,非常便于传输。

扩展:JWT是自我包涵的,包含了必要的所有信息,不需要在服务端保存会话信息, 非常易于应用的扩展。

2.3 怎么使用JWT
2.2.1导入依赖
<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId>
</dependency>
2.2.2 创建工具类
public class JwtUtils {//------------------------------------常量------------------------------------------------
/*EXPIRE     :令牌失效时间  (1000 * 60 * 60 * 24)ms  24h     APP_SECRET :密钥,【自定义】
*/public static final long EXPIRE = 1000 * 60 * 60 * 24;public static final String APP_SECRET = "ukc8BDbRigUDaY6pZFfWus2jZWLPHO";//------------------------------------常量------------------------------------------------//-----------------------------------获取token--------------------------------------------public static String getJwtToken(String id, String name){String JwtToken = Jwts.builder().setHeaderParam("typ", "JWT")      //令牌的类型.setHeaderParam("alg", "HS256")    //加密算法.setSubject("user")                //分类,【根据实际修改】.setIssuedAt(new Date())           //生成token日期.setExpiration(new Date(System.currentTimeMillis() + EXPIRE)).claim("id", id)                   //【自定义字段】.claim("name", name).signWith(SignatureAlgorithm.HS256, APP_SECRET).compact();return JwtToken;}
//-------------------------------判断token是否存在与有效,传jwtToken-------------------------public static boolean checkToken(String jwtToken) {if(StringUtils.isEmpty(jwtToken)) return false;try {Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken);} catch (Exception e) {e.printStackTrace();return false;}return true;}
//-------------------------------判断token是否存在与有效,传request--------------------------public static boolean checkToken(HttpServletRequest request) {try {String jwtToken = request.getHeader("token");if(StringUtils.isEmpty(jwtToken)) return false;Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken);} catch (Exception e) {e.printStackTrace();return false;}return true;}
//---------------------------------获取id-------------------------------------------------public static String getMemberIdByJwtToken(HttpServletRequest request) {String jwtToken = request.getHeader("token");if(StringUtils.isEmpty(jwtToken)) return "";Jws<Claims> claimsJws = Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken);Claims claims = claimsJws.getBody();return (String)claims.get("id");}

SSO方式实现微服务的登入业务相关推荐

  1. dubbo consumer 端口_基于Springboot+Dubbo+Nacos 注解方式实现微服务调用

    今天跟大家分享基于Springboot+Dubbo+Nacos 注解方式实现微服务调用的知识. 1 项目结构 |-- spring-boot-dubbo-demo (父级工程) |-- spring- ...

  2. Service Mesh服务网格:8种方式简化微服务部署

    Robert Whiteley translate by Grace 基于微服务的架构是未来的趋势,但是实现这种架构会面临许多困难.现代应用架构远比过去的架构复杂,因此实现微服务架构将会带来了一系列特 ...

  3. 若依微服务版怎样新增业务子模块并使用代码生成实现对表的增删改查

    场景 若依微服务版手把手教你本地搭建环境并运行前后端项目: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/109363303 在前 ...

  4. 微服务架构设计模式~根据业务能力进行服务拆分

    业务能力定义了一个组织的工作 组织的业务能力通常是指这个组织的业务是做什么,它们通常是稳定的. 与之相反,组织采用何种方式来实现它的业务能力,是随着时间不断变化的. 识别业务能力 一个组织有哪些业务能 ...

  5. Springboot+Dubbo+Nacos 注解方式实现微服务调用

    点击上方"Java知音",选择"置顶公众号" 技术文章第一时间送达! 作者:Sans_ juejin.im/post/5dc3f5116fb9a04a7d771 ...

  6. 微服务架构开发实战:API网关意义和常见API网关的实现方式

    API网关意义 API网关旨在用一套单一且统一的API入口点,来组合一个或多个内部API. API网关定位为应用系统服务接口的网关,区别于网络技术的网关,但是原理是一样的.API网关统一服务入口,可方 ...

  7. 提交响应后无法调用sendredirect_微服务的那些事(三),微服务的远程调用方式。RPC和HTTP...

    2.远程调用方式 无论是微服务还是SOA,都面临着服务间的远程调用.那么服务间的远程调用方式有哪些呢? 常见的远程调用方式有以下几种: RPC:Remote Produce Call远程过程调用,类似 ...

  8. 实现远程调用_微服务的那些事(三),微服务的远程调用方式。RPC和HTTP

    2.远程调用方式 无论是微服务还是SOA,都面临着服务间的远程调用.那么服务间的远程调用方式有哪些呢? 常见的远程调用方式有以下几种: RPC:Remote Produce Call远程过程调用,类似 ...

  9. 【微服务架构】基础的微服务架构模板、fianceCampus项目

    OfferCampus前期构建简单介绍: 搭建完整的模板Spring Cloud项目 内容管理 SpringCloud 项目 脚手架项目 ---- financeCapmus 项目结构 创建父项目(j ...

最新文章

  1. Nature:FB和推特的数据是如何革新社会科学,改变世界的?
  2. 微信小游戏视频激励广告onClose接口叠加回调的问题解决方法
  3. 屏蔽鼠标右键、Ctrl+N、Shift+F10、F11、F5刷新、退格键
  4. css行高line-height的一些深入理解及应用
  5. 1 access中iif函数中的_JavaScript中的高阶函数
  6. Python 排序 -- sort()、sorted()
  7. MyBatisPlus(笔记)
  8. StarUML3.0.2——超好用的UML画图工具推荐
  9. 微信小程序分享功能的实现
  10. 2018 蓝桥杯 C++ A组 1-7
  11. php fpm ondemand,AMH中PHP运行模式设置php-fpm为ondemand模式
  12. Chrome浏览器对统一资源发出多个请求时,导致最多停止20s问题
  13. 关于统信UOS操作系统版本介绍
  14. 在输入框加入搜索图标的问题
  15. 希尔排序|Golang
  16. 常见数据结构在内存中是怎么存储的
  17. [教程]centos7.x 及centos8 硬盘安装法#免U盘#采坑记
  18. instanceclient安装与配置
  19. 模糊熵 matlab,近似熵/模糊熵/样本熵MATLAB代码
  20. H3C 无线交换机和FIT AP的典型连接

热门文章

  1. ArcGIS-分割/裁剪矢量面要素( 不相邻面)
  2. 吴畏嶙2019大作业
  3. 极光推送集成APP和web服务
  4. 2023 年腾讯云服务器配置价格表出炉(2核2G/2核4G/4核8G/8核16G、16核32G)
  5. 计算机的CPU和GPU的区别,CPU 和 GPU 有什么区别
  6. react性能优化之memo的作用和memo的坑
  7. Incaseformat 蠕虫病毒威胁通告
  8. 北京千丁门禁卡复制 芯片是Nt芯片
  9. 苹果以旧换新活动_同是以旧换新,苹果OPPO有哪些差异?懂手机的都知道它更良心...
  10. idea右侧maven出现多个root根节点,删除报错:You can not remove xxxx because its imported as