JWT入门以及常见的登录问题

用户登录 JWT原理剖析 JWT与单点登录实例解释 首先从用户的登录原理和实现讲起,然后引申出JWT的登录方式,在详细的讲解了JWT的原理之后我们会通过案例讲解JWT是如何保存用户信息。 阅读详情
AI摘要

本文详细介绍了JWT的概念、生成与解析过程,以及在登录场景中的应用,包括有状态与无状态登录的区别,分布式项目中的登录处理,Token的续签、续期和登出策略。此外,还讨论了如何在实际开发中解决JWT带来的挑战。

在这里插入图片描述

本文主要介绍了JWT是什么,如何使用JWT以及实际开发中可能会遇到的有关JWT登录问题,比如token的续签、续期和登出问题等。

1 JWT概念

1.1 什么是JWT

JWT官方网址

Json Web Token是通过数字签名的方式,以json为载体,在不同的服务之间安全的传输信息的技术。

1.2 JWT有什么用

一般使用在授权认证的过程中,一旦用户登录,后端返回一个token给前端,相当于后端给了前端返回了一个授权码,之后前端向后端发送的每一个请求都需要包含这个token,后端在执行方法前会校验这个token(安全校验),校验通过才执行具体的业务逻辑。

1.3 JWT的组成结构

JWT由Header(头信息),PayLoad (用户信息),Signature(签名)三个部分组成请添加图片描述

Header头信息主要声明加密算法:(具体算法对称不对称加密不作为研究内容)

通常直接使用 HMAC HS256这样的算法

{
  "typ":"jwt"
  "alg":"HS256" //加密算法
}

然后将头部进行base64加密(该加密是可以对称解密的),构成了第一部分

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9

PayLoad(载荷)
指定了七个默认字段供选择

iss:发行人
exp:到期时间
sub:主体
aud:用户
nbf:在此之前不可用
iat:发布时间
jti:JWT ID用于标识该JWT

也可以自定义私有字段,但是不建议在此存放敏感信息,因为此部分可以解码还原出原始内容。虽然它可以解码,但是也不能修改这个内容。

{
  "username":"zhangsan",
  "name":"张三",
}

对其进行base64加密,得到Jwt的第二部分

eyJ1c2VybmFtZSI6InpoYW5nc2FuIiwibmFtZSI6IuW8oOS4iSIsImFnZSI6MTgsInNleCI6IuWlsyIsImV4cCI6MTY0NzE0NTA1MSwianRpIjoiMTIxMjEyMTIxMiJ9

Signature 签证信息,此部分用于防止jwt内容被篡改。这个签证信息由三部分组成(由加密后的Header,加密后的PayLoad,加密后的签名三部分组成)

  • header (base64后的)
  • payload (base64后的)
  • secret

base64加密后的header和base64加密后的payload使用.连接组成的字符串,然后通过header中声明的加密方式进行加盐加密,然后就构成了jwt的第三部分,每个部分直接使用"."来进行拼接

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6InpoYW5nc2FuIiwibmFtZSI6IuW8oOS4iSIsImFnZSI6MTgsInNleCI6IuWlsyIsImV4cCI6MTY0NzE0NTA1MSwianRpIjoiMTIxMjEyMTIxMiJ9.5tmHCpcsS_VuZ2_z5Rydf2OpsviBGwB-fJE5aS7gKqE

1.4 JWT的优点和缺点

基于session和基于jwt的方式的主要区别就是用户的状态保存的位置,session是保存在服务端的,而jwt是保存在客户端的。

优点:

  • jwt基于json,非常方便解析。

  • 可以在令牌中自定义丰富的内容,易扩展。

  • 资源服务使用JWT可不依赖认证服务即可完成授权。

  • 通过非对称加密算法及数字签名技术,JWT防止篡改,安全性高。

缺点:

  • JWT 中的信息可以在客户端解码,因此敏感信息不应该存储在 JWT 中,尤其是不加密的情况下。

  • 如果使用对称加密算法并且密钥被泄漏,攻击者可以使用该密钥签发有效的 JWT。为了防止这种情况发生,应该使用安全的加密算法,并妥善保管密钥。

  • JWT 不支持会话管理,也不能主动使令牌失效。因此,在某些情况下,需要实现其他机制来管理用户会话和授权状态。

  • JWT 一旦签发,就无法撤回或修改,除非到了过期时间。因此,如果令牌被盗用,攻击者可以使用它来获得未经授权的访问权限。

  • JWT 的长度相对较长,可能会影响网络传输性能。

2 使用JWT

2.1 引入jwt坐标

<dependency>
	<groupId>io.jsonwebtoken</groupId>
	<artifactId>jjwt</artifactId>
	<version>0.9.1</version>
</dependency>

2.2 生成token

//1.声明加密的算法
SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
//2.声明过期时间
long expMillis = System.currentTimeMillis() + 过期毫秒值;
Date exp = new Date(expMillis);
//3.配置jwt中要存入的信息
Map claims = new HashMap();
claims.put("id",1001);
claims.put("name","admin");
//4.创建密钥
String secretKey = "miyao"    

//5.生成jwt
String token = Jwts.builder()
    //配置jwt中需要保存的数据
    .setClaims(claims)
    //配置加密算法&加密的key
    .signWith(signatureAlgorithm, secretKey.getBytes(StandardCharsets.UTF_8))
    //配置过期时间
    .setExpiration(exp)
    //根据配置信息生成jwt
    .compact();

2.3 解析token

Claims claims = Jwts.parser()
    // 设置签名的秘钥
    .setSigningKey(secretKey.getBytes(StandardCharsets.UTF_8))
    // 设置需要解析的jwt
    .parseClaimsJws(token).getBody();

int id = claims.get("id");

2.4 jwt工具类

/**
 * jwt工具类
 */
public class JwtUtils {

    /**
     * 生成token加密令牌
     * @param params    =>  存入的数据
     * @param secretKey =>  签名的密钥
     * @param ttlMills  =>  过期时间(毫秒)
     * @return 生成的jwt token
     */
    public static String createToken(Map<String, Object> params, String secretKey, long ttlMills){

        //1.声明加密的算法
        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
        //2.声明过期时间
        long expMillis = System.currentTimeMillis() + ttlMills;
        Date exp = new Date(expMillis);
        //3.生成jwt
        String token = Jwts.builder()
                //配置jwt中需要保存的数据
                .setClaims(params)
                //配置加密算法&加密的key
                .signWith(signatureAlgorithm, secretKey.getBytes(StandardCharsets.UTF_8))
                //配置过期时间
                .setExpiration(exp)
                //根据配置信息生成jwt
                .compact();

        return token;
    }

    /**
     * 验证jwt, 解析token
     * @param token      =>  加密令牌
     * @param secretKey  =>  密钥
     * @return 解析的结果集
     */
    public static Claims parseToken(String token, String secretKey){

        Claims claims = Jwts.parser()
                // 设置签名的秘钥
                .setSigningKey(secretKey.getBytes(StandardCharsets.UTF_8))
                // 设置需要解析的jwt
                .parseClaimsJws(token).getBody();

        return claims;
    }

}

3 登录问题

3.1 有无状态登录

3.1.1 有状态登录

cookie+session,所谓的状态就是在服务端存储session信息。客户端访问服务端的时候,在cookie中携带sessionId,服务端根据sessionId就能才找到对应的session信息。

缺点:分布式支持不好,默认是内存存储,一般用的时候:把sessionId存到redis中

3.1.2 无状态的登录

服务端不存储session信息,就需要token机制,客户端访问服务端的时候,需要在header或者是cookie中传递token信息,并且token中是携带了用户信息的。一旦生成,不能修改。

优点:分布式支持好

缺点:实现比较麻烦,续约、登出

续约:每次访问重新生成一个新的token(不推荐);使用两个token,accesstoken refreshtoken(有效期长); 临近过期生成新的token

登出: 登出之后,把token的id存入redis的黑名单

3.2 单体项目登录问题

单体项目,可以使用session来维持会话,但是生产环境为了避免单点故障,一般都会部署多个节点,为了避免session不同步的问题,可以在nginx上开启ip_hash这种负载均衡算法,让来自同一个ip的客户端请求始终落到同一个tomcat上,就是所谓的session粘连。

ip_hash

nginx提供ip_hash指令可实现session粘连需求,根据用户ip计算hash值,从而每次都分配到指定机器上,ip_hash支持配置weight权重。

但是ip_hash也有个不足,要求nginx必须是最前端的机器,即用户不经过其他服务中转,直接请求nginx,这样ip_hash才能生效。如果在nginx和用户中间有别的服务,比如SLB、LVS等负载集群,nginx的ip_hash指令可能会失效。

Nginx配置如下:

worker_processes  1;
 
events {
    worker_connections  1024;
}
 
http {
	
	upstream ipHashDemo{
		
		ip_hash;
		server 127.0.0.1:8081;
		server 127.0.0.1:8082;
	}
	
	server{
	
		listen 8888;
		server_name 127.0.0.1;
		location / {
		
			proxy_pass http://ipHashDemo;
		}
	}
}
  • worker_processes 1; 表示 Nginx 使用单个 worker 进程。

  • events { worker_connections 1024; } 表示每个 worker 进程可以同时处理的最大连接数为 1024。

  • upstream ipHashDemo{…} 定义了一个名为 “ipHashDemo” 的负载均衡组,使用 IP 哈希算法,并将请求转发到两台后端服务器(分别监听 8081 和 8082 端口)。

  • server {…} 定义了一个虚拟主机,监听在本地 8888 端口,请求经过负载均衡组 “ipHashDemo” 处理并代理到后端服务器。

  • location / {…} 表示该虚拟主机对所有请求都进行代理。

根据上面的配置文件会启动一个 Nginx 实例,在监听 8888 端口时对所有请求进行负载均衡,ip_hash在上面的配置文件中用于定义一个名为 “ipHashDemo” 的负载均衡组,并使用 IP 哈希算法对请求进行路由。这样做的好处是在多个请求中,相同 IP 的请求总是会被路由到同一台后端服务器上,避免了一些请求需要重复地建立连接和发送状态信息的情况,提高了性能。

upstream hash

既然自带的ip_hash指令不好使,那么能不能自己指定一个字段来计算hash值,替代ip值,比如cookie或者request uri里面的一个能标识用户id的字段。

有个第三方的nignx模块nginx_upstream_hash-0.3.1可以实现该效果,该模块提供hash指令,可以指定一个变量用于hash,示例如下:

hash指令后面的变量可以设置为其他有效的nginx变量。

http {
    upstream backend {
        hash $arg_user_id consistent;
        server backend1.example.com;
        server backend2.example.com;
        server backend3.example.com;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://backend;
        }
    }
}

在这个配置中,我们定义了一个名为 “backend” 的负载均衡后端,指定了哈希指令 “hash $arg_user_id consistent”,即使用 GET 请求参数中的 “user_id” 变量作为哈希键,并且启用一致性哈希算法。然后我们将三个后端服务器添加到 upstream 中。

最后在 server 块中,我们将请求转发到 “backend” 负载均衡组。由于我们在 upstream 中启用了哈希算法并指定了要使用的变量,因此同一用户的请求会被分配到同一台后端服务器上。

3.3 分布式项目登录问题

redis存储session信息

用户登录成功以后,服务端生成一个uuid(token),同时把uuid作为key,用户信息作为value存储到redis中,然后把uuid返回给客户端。客户端在访问服务端接口的时候,可以在cookie或者header中传递这个uuid,服务端收到请求,首先读取这个uuid,然后根据uuid去redis中查找用户。这种方式也可以避免session的不同步问题,因为现在是存储到了多个节点都可以访问的redis中。

3.3.1 解析token并向下游的微服务传递

以admin为例,admin中所有的接口(除了登录),都需要登陆以后才能访问。admin服务接口中需要知道是哪个用户的请求。所以网关直接把解析出来的userId传递给下游的微服务即可。

如何传递?

// 把userId传递给下游的微服务
request.mutate().header("userId", "" + userId);

使用的是spring5提供webflux的api向request中追加请求头。

3.3.2 完整的登录和鉴权过程

1)前端用户传递的用户名和密码,服务端收到请求,根据用户名到db查询记录,根据db中记录的password与前端传递的password做匹配,如果能匹配成功,则生成jwt token返回给前端,token中携带了userId。

2)前端会把token保存到local storage(本地存储器)中,在随后的访问中,在header中携带上这个token。

3)前端的请求首先是到网关,网关中有一个全局的过滤器,会从请求中读取header中的token,解析,把解析出来的userId放入http的header中继续向下游的微服务传递,header的key=userId。

4)微服务中有一个拦截器,在拦截器中拦截请求,从header中解析出userId,然后保存到ThreadLocal中。

5)在微服务的接口中,就可以使用ThreadLocal来获取用户信息。

3.3.3 Token续签问题

单token方案

  • 将 token 过期时间设置为15分钟;
  • 前端发起请求,后端验证 token 是否过期;如果过期,前端发起刷新token请求,后端为前端返回一个新的token;
  • 前端用新的token发起请求,请求成功;
  • 如果要实现每隔72小时,必须重新登录,后端需要记录每次用户的登录时间;用户每次请求时,检查用户最后一次登录日期,如超过72小时,则拒绝刷新token的请求,请求失败,跳转到登录页面。

另外后端还可以记录刷新token的次数,比如最多刷新50次,如果达到50次,则不再允许刷新,需要用户重新授权。

双token方案

  • 登录成功以后,后端返回 access_token 和 refresh_token,客户端缓存此两种token;
  • 使用 access_token 请求接口资源,成功则调用成功;如果token超时,客户端携带 refresh_token 调用token刷新接口获取新的 access_token;
  • 后端接受刷新token的请求后,检查 refresh_token 是否过期。如果过期,拒绝刷新,客户端收到该状态后,跳转到登录页;如果未过期,生成新的 access_token 返回给客户端。
  • 客户端携带新的 access_token 重新调用上面的资源接口。
  • 客户端退出登录或修改密码后,注销旧的token,使 access_token 和 refresh_token 失效,同时清空客户端的 access_token 和 refresh_toke。

1, 登录成功,生成两个token存到cookie或者local storage (一长一短)

2, 发起请求,网关检验token(短),验证通过则添加到请求头并放行路由到微服务,不通过则说明过期或者被篡改, 封装响应码通知前端

3, 前端接收通过,将token(长)发送给后端请求刷新token的请求,后端检验token(长),验证通过则重新生成两个token返回给前端,然后添加到请求头并放行路由到微服务,不通过则说明过期或者被篡改

3.3.4 Token续期处理

用户登录完成以后,服务端会生成两个token,一个是有效期比较短的accesstoken,比如2小时,还有一个是有效期长的refreshToken,比如30天,客户端会把这两个token都保存到客户端本地存储
客户端在随后访问服务端接口的时候,需要在header中携带accesstoken。请求首先是到网关,网关会做token过期时间的判断,如果token没过期则正常放行到后端的微服务,如果token已经过期,网关会返回一个特殊的代表token过期的响应码4001,客户端收到4001状态码的响应以后,不会向客户端提示失败,而目继续访问服务端提供的refresh token的请求,这个请求会返回一个新的accesstoken和refreshtoken,客户端会继续使用这个新的accesstoken去访问服务端的接口。

3.3.5 Token登出处理

生成token的时候,会给token设置一个token id
当用户退出的时候,把token id存放到redis中,key: token id,value:userld,有效期设置2小时
网关收到请求的时候,首先是根据token id去redis中查询,如果能查到值,说明token已经退出了,则返回token已经失效,如果查不到,则说明token是有效的,继续后续的业务逻辑外理。

3.4 如何获取客户端的各种信息

HttpServletRequest request = ServletActionContext.getRequest();
System.out.println("浏览器基本信息:"+request.getHeader("user-agent"));
System.out.println("客户端系统名称:"+System.getProperty("os.name"));
System.out.println("客户端系统版本:"+System.getProperty("os.version"));
System.out.println("客户端操作系统位数:"+System.getProperty("os.arch"));
System.out.println("HTTP协议版本:"+request.getProtocol());
System.out.println("请求编码格式:"+request.getCharacterEncoding());
System.out.println("Accept:"+request.getHeader("Accept"));
System.out.println("Accept-语言:"+request.getHeader("Accept-Language"));
System.out.println("Accept-编码:"+request.getHeader("Accept-Encoding"));
System.out.println("Connection:"+request.getHeader("Connection"));
System.out.println("Cookie:"+request.getHeader("Cookie"));
System.out.println("客户端发出请求时的完整URL"+request.getRequestURL());
System.out.println("请求行中的资源名部分"+request.getRequestURI());
System.out.println("请求行中的参数部分"+request.getRemoteAddr());
System.out.println("客户机所使用的网络端口号"+request.getRemotePort());
System.out.println("WEB服务器的IP地址"+request.getLocalAddr());
System.out.println("WEB服务器的主机名"+request.getLocalName());
System.out.println("客户机请求方式"+request.getMethod());
System.out.println("请求的文件的路径"+request.getServerName());
System.out.println("请求体的数据流"+request.getReader());
BufferedReader br=request.getReader();
String res = ""; 
while ((res = br.readLine()) != null) {  
    System.out.println("request body:" + res);   
}
System.out.println("请求所使用的协议名称"+request.getProtocol());
System.out.println("请求中所有参数的名字"+request.getParameterNames());
Enumeration enumNames= request.getParameterNames();
while (enumNames.hasMoreElements()) {
    String key = (String) enumNames.nextElement();
    System.out.println("参数名称:"+key);
}

在这里插入图片描述

JWT实现单点登录 基于hutool工具,实现JWT模式的单点登录。完成登录流程和校验流程 阅读详情

相关推荐

JWT 令牌撤销:中心化控制与分布式Kafka处理

撤销的令牌存储在内存中,在合适的数据结构中定位令牌是一个快速的过程(如果我们使用 HashMap,它将是O(1))。当访问令牌的生命周期到期并且用户收到401 Unauthorized响应时,他们应该请求/refresh-token端点,将刷新令牌值作为参数传递,并接收新的访问令牌/刷新令牌对作为响应。在最坏的情况下,令牌泄露后,它的有效期还有 15 分钟,之后它将exp小于当前时间,并且令牌将被任何微服务拒绝。令牌被撤销的时间与微服务使用和处理撤销消息的时间之间可能存在轻微的延迟。

804

JWT 实现登录

jwt 全称是 json web token。是由用户以用户名、密码登录,服务端验证后,会生成一个 token,返回给客户端,客户端在下次访问的过程中携带这个 token,服务端责每次验证这个token。

Dailyblue的专栏 9620

JWT面试常见问题

JWT面试常见问题 jwt和security的对比: JWT的优点: 无需再服务端存储用户数据,减轻服务端压力 轻量级,json风格,比较简单 跨语言 JWT的缺点: token一旦签发,无法修改 无法更新token有效期,用户登录状态刷新难以实现 无法销毁一个token,服务端不能对用户状态进行绝对控制 不包含权限控制 SpringSecurity: 优点: 用户信息保存再服...

Mingju's Blog 1万+

使用jwt实现登录功能

一、什么是jwt 1.什么是session 要想知道什么是jwt,就要先知道什么是session,可以这样理解session,处于安全问题,有一些数据需要保存在服务端,服务端根据客户端的sessionId可以识别到它的session,然后进行数据的处理。 session一般存储一些简单,并且比较重要的信息,例如用户id,用户登录状态,权限等。 注意,如果用户禁用了cookie,那么session也就无法使用,因为session使用cookie中携带的唯一id才能在服务器中找到 2.什么是jwt? jwt全

weixin_44712778的博客 6568

水文预报新手别怕!用Matlab 18小时搞定马斯京根法参数K和x(附完整代码)

本文详细介绍了如何使用Matlab在18小时内快速掌握水文预报中的马斯京根法参数K和x的求解方法。通过完整的代码示例和分步解析,帮助新手从理论到实践快速跨越,解决传统手工试算耗时耗力的问题,提升水文预报的效率和精度。

weixin_42573113的博客 258

WebUI自动化测试框架搭建(python+pytest+selenium+allure)

将鼠标移动到要定位的元素上面>右键>点击“检查”>在元素代码上右键>复制>复制XPath。

m0_63729339的博客 1281

如何通过 JWT 来解决登录认证问题

JWT 令牌本身是一个字符串,包括头部,载荷,签名三部分,将信息作为 JSON 对象进行传输头部:包括令牌的类型和使用的哈希算法载荷:存储的有效信息,为自定义内容签名:用于防止 JWT 内容被篡改(并不是防止被解析),只要被篡改,令牌就会失效。

2202_76097976的博客 1880

四、嘉立创EDA原理图绘制实战:从零搭建STM32温湿度监测系统

本文详细介绍了使用嘉立创EDA标准版从零开始绘制STM32温湿度监测系统原理图的完整流程。涵盖核心元器件选型、电源电路设计、ADC按键创新应用及模块化布局技巧,帮助电子爱好者快速掌握STM32系统设计,提升嵌入式开发实战能力。

h0i1j2k3l的博客 884

SpringBoot+JWT登录校验,以及JWT刷新机制

接上篇博客,继续讲解JWT的使用。 本部分内容主要是SpringBoot项目中具体使用JWT的代码实现,包括了登录创建Token,后续请求验证Token,并且加入了JWT刷新机制等等。 本文大纲: 1.JWT的引入 2.JWT工具类的实现 3.登录申请Token 4.请求验证Token 5.JWT刷新机制的实现 注意:本文注重使大家理解JWT如何在SpringBoot项目中集成和使...

Slience Wind 8289

Oracle 查看 rman 备份情况 SQL 语句

每天一个 DBA 小知识,助你更进一步!

LuciferLiu_DBA 3119

硅电容的工艺结构原理及选型参数总结

硅电容,也称为硅质电容或硅二极管电容,是一种特殊的电容器。它利用硅二极管的结构来实现电容的功能。本文对硅电容的工作原理,结构特点,选型参数及设计注意事项进行总结。

fydar的博客 2332

JWT单点登录

项目开发视频: SpringCloud微服务开发入门 手把手开发基于SpringBoot的员工管理系统 亿度云盘~Java小白入门实战 超详细的Java知识点汇总 单点登录是什么 SSO(Single Sign On)SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。 为什么需要单点登录 以前分布式系统的多个相关的应用系统,都需要分别进行登录,非常繁琐。 原来登录的过程: 1)用户输入账号密码 2)提交到后台验证,成功后将用户存在Session中 3)需要进行登录状态判

恒哥的博客 4540

1. 动手开发第一个 SAP CDS View

在开始学习前,大家需要根据这篇文章介绍的步骤,在自己本地电脑上,把 ABAP Development Tool 安装好。右键单击这个添加好的 ABAP 开发包,选择新建一个 ABAP Repository Object,类型就选择。,就可以像在 SAPGUI 里使用 SE16 那样,查看这个 CDS View 的内容。笔者下一篇文章,会详细介绍我们创建的第一个 CDS View 的每一行代码的详细含义。从本文开始,正式进入 CDS View 开发的学习。的条件,然后点击 Run 重新执行,得到结果。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1271

jwt无状态登陆常见面试问题总结

1.Jwt和Spring Security的对比: JWT的: 优点: 无需再服务端存储用户数据,减轻服务端压力 轻量级,json风格,比较简单 跨语言 有利于水平扩展 缺点: token一旦签发,无法修改 无法更新token有效期,用户登录状态刷新难以实现 无法销毁一个token,服务端不能对用户状态进行绝对控制 不包含权限控制 SpringSecurity: 优点: 用户信息保存再服务端,服务端可以对用户状态绝对控制 基于Spring,无缝整合,修改登录逻辑,其实就是添加过

weixin_51291483的博客 1984

SPRD Android 14 通过属性控制系统设置显示双栏或者单栏

SPRD Android 14 通过属性控制系统设置显示双栏或者单栏

m0_60898338的博客 1118

YOLOv11【第一章:零基础入门篇·第1节】YOLOv11核心架构深度解析与环境配置,一文搞定!

🏆 本文收录于专栏 《YOLOv11实战:从入门到深度优化》。 本专栏围绕 YOLOv11 的改进、训练、部署与工程优化 展开,系统梳理并复现当前主流的 YOLOv11 实战案例与优化方案,内容目前已覆盖 分类、检测、分割、追踪、关键点、OBB 检测 等多个方向。

**My Coding Family** 5511

JWT实现登录

之前我们是通过 session 来记录用户登录状态,跟踪用户信息,那么就要在这里提一提 session 登录的缺陷:1.session 是将客户端数据储存在服务器的内存,当客户端的数据过多,连接较多,服务器的内存开销大。 2.session 的数据储存在某台服务器,在分布式的项目中无法做到共享。 3.前后端分离的项目中共享 session 比较困难。 4.jwt 不需要在服务端去保留用户的认证信息或者会话信息。jwt 全称是 json web token。是由用户以用户名、密码登录,服务端验证后,会生成一个

xhaxy的博客 1061

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

JWT 登录校验,黑马点评登录模块整合 JWT 解决session共享问题

在学习的过程中遇到了很多有关 用户信息存储 的技术,比如 Session、Cookie、JWT、ThreadLocal ,以及一些相关的缓存技术 比如 Redis。那么他们之间有什么区别,我该怎么选择,这是我所遇到的问题。在学习黑马点评项目的过程,原项目使用的是 Session,由于之前学习的是 JWT,所以想到使用 JWT 来对原项目进行改造,同时尝试探究一下其他技术相关的知识。

qq_61901330的博客 1403

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

用户登录和权限认证之 —— JWT

这里我会讲解 web 前端常用的用户登录和权限认证的方法 —— JWT,有错误希望指正 文章目录1、Cookie + Session① 概述② 流程图③ 校验步骤④ 存在的问题2、JWT① 流程图② 校验步骤③ 解读 token 中存储的内容④ 对 Swagger 一个功能的补充3、总结 1、Cookie + Session        在讲解 JWT 之前,我先介绍一下最简单的用户登录和权限认证方式:Cookie + Ses.

qq_45770253的博客 3682

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

JWT登录

*

qq_46627805的博客 1929

登陆模块之JWT单点登录

功能描述:通过一次登录来实现多个模块之间来回跳转,数据同步 单点登录的实现方式 redis实现session共享 jwt单点登录 cas单点登录 买单点登录服务器 本篇博客着重讲解JWT单点登录 首先来说下什么是无状态登录吧 务器不存登录的状态和数据,每次访问后台的过程中都需要把密码等用户数据全部校验一遍,校验成功才算登录。 无状态登录的好处是,数据不需要在服务端session或redis中存...

Super_wolve的博客 2565

vue+springboot实现JWT登录验证

vue+springboot实现jwt登录验证,前后端逻辑皆给出

xc9711的博客 2331

基于 JWT 的登录认证

JWT(JSON Web Token)是一种用于身份验证和授权的开放标准(RFC 7519),它通过 JSON 对象在客户端和服务器之间安全地传输信息。JWT 通常用于实现无状态的登录认证机制。以下是关于和JWT 由三部分组成,用JWTHS2562.3.RSA SHA256Cookie。

m0_71975922的博客 1027

JWT的登录认证实现

在用户成功输入用户名和密码并看到“登录成功”提示的那一刻,系统的安全之旅才刚刚启程。对于系统而言,真正关键的是如何确保在用户后续的所有操作(如查看员工列表、修改个人信息等)中,能够准确识别“此用户即为刚才成功登录的用户”。JWT令牌就是解决这一问题的关键所在。它是在登录成功后生成的一段特殊字符串,宛如用户在系统内后续请求的“电子通行证”。本文将详细讲解在登录成功后,如何生成有效的JWT令牌,从开发专用工具类,到整合到登录接口,再到进行全面细致的测试,助力你的系统达成“一次登录,安全访问”的目标。

2401_86968005的博客 979

Zendesk JWT SSO 示例项目常见问题解决方案

Zendesk JWT SSO 示例项目常见问题解决方案 项目基础介绍 Zendesk JWT SSO 示例项目是一个开源项目,旨在帮助开发者理解和实现使用 JSON Web Token (JWT) 进行 Zendesk 单点登录 (SSO) 的功能。该项目提供了多种编程语言的示例代码,包括 Ruby、Java、JavaScript、Python、C# 和 Go 等。通过这些示例代码,开发者可以学...

gitblog_01116的博客 680
上一篇: 接口幂等性问题和常见的解决方案
下一篇: 一文看懂gRPC远程调用框架
霁晨晨晨
博客等级 码龄4年 359粉丝 32原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

霁晨晨晨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值