JWT实践原理以及自己生成token案例

Hutool-jwt使用-Token的创建 【代码】Hutool-jwt使用-Token的创建。 阅读详情

JWT实践

jwt教程网站 https://jwt.io/

JWT引入依赖

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

JWT生成和解析工具类

package com.asiainfo.framework.util;

import cn.hutool.core.bean.BeanUtil;
import com.asiainfo.framework.dto.LoginUseInfo;
import com.asiainfo.framework.enums.ExceptionEnums;
import io.jsonwebtoken.*;
import lombok.extern.slf4j.Slf4j;

import java.util.Calendar;
import java.util.Map;


@Slf4j
public class JwtUtil {
    private static final String KEY = "aaa";

    public static String generateToken(LoginUseInfo loginUseInfo) {
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.DATE, 1);
        Map<String, Object> userInfo = BeanUtil.beanToMap(loginUseInfo);
        JwtBuilder builder = Jwts.builder()
                .setClaims(userInfo)
                .setExpiration(calendar.getTime())
                .signWith(SignatureAlgorithm.HS256, KEY);
        return builder.compact();
    }

    public static LoginUseInfo verifyToken(String tokenToBeVerify) {
        Claims claims = null;
        try {
            claims = Jwts.parser()
                    .setSigningKey(KEY) // 使用签名用到的key
                    .parseClaimsJws(tokenToBeVerify).getBody();
        } catch (SignatureException e) {
            log.error("签名异常:{}", e.getMessage());
            ExceptionEnums.TOKEN_PARSE_ERROR.error();
        } catch (ExpiredJwtException e) {
            log.error("令牌过期:{}", e.getMessage());
            ExceptionEnums.TOKEN_PARSE_ERROR.error();
        } catch (MalformedJwtException e) {
            log.error("token格式不对:{}", e.getMessage());
            ExceptionEnums.TOKEN_PARSE_ERROR.error();
        } catch (Exception e) {
            log.error("token校验异常", e.getMessage());
            ExceptionEnums.TOKEN_PARSE_ERROR.error();
        }
        return BeanUtil.mapToBean(claims, LoginUseInfo.class, true);
    }
}

生成token时可以设置Claim来设置token传输中的数据,并且设置过期时间,指定签名算法和盐,加密的盐和解密的盐要一样

在application.yml里面配置拦截器的白名单

# jwt 配置相关
aif:
  auth:
    jwt:
      uncheckUrls:
        - /openapi/**
        - /feign/**

设置加载类

@Configuration
@ConfigurationProperties("aif.auth.jwt")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class JwtSsoProperties {
    private List<String> uncheckUrls ;
    private boolean checkIp = false;

    @PostConstruct
    public void init() {
        for (String uncheckUrl:uncheckUrls){
            System.out.println(uncheckUrl);
        }
    }
}

设置jwt的拦截器校验请求头里面的token

package com.asiainfo.framework.interceptor;

import com.asiainfo.framework.config.JwtSsoProperties;
import com.asiainfo.framework.dto.LoginUseInfo;
import com.asiainfo.framework.util.JwtUtil;
import com.asiainfo.framework.util.UserInfoManager;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import org.apache.logging.log4j.util.Strings;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.util.AntPathMatcher;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

/**
 * @description:
 * @author: Mr.Wang
 * @create: 2021-11-03 18:06
 **/
@Component
public class JwtInterceptor implements HandlerInterceptor {
    private static final Logger log = LoggerFactory.getLogger(JwtInterceptor.class);
    final JwtSsoProperties jwtSsoProperties;
    private final AntPathMatcher antPathMatcher = new AntPathMatcher();


    public JwtInterceptor(JwtSsoProperties jwtSsoProperties) {
        this.jwtSsoProperties = jwtSsoProperties;
    }

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String token = request.getHeader("ai-jwt-token");
        if (StringUtils.isBlank(token)) {
            token = this.getCookieToken(request);
            log.info("header中没有token,尝试从cookie中获取,token ={}", token);
        }
//        System.out.println(request.getRequestURI());
//        System.out.println(request.getHeader("ai-jwt-token"));
        boolean needCheck = this.needLoginCheck(request);
        if (needCheck) {
            LoginUseInfo loginUseInfo = JwtUtil.verifyToken(token);
            UserInfoManager.getInstance().setUser(loginUseInfo);
            if (loginUseInfo != null) {
                UserInfoManager.getInstance().setUser(loginUseInfo);
                return true;
            } else {
                return false;
            }
        }
//       如果为白名单并且token非空也解析token 为了在application中配置feign调用的方式为白名单,并且解析feign之间调用token拿到当前用户
        if (!StringUtils.isBlank(token)) {
            LoginUseInfo loginUseInfo = JwtUtil.verifyToken(token);
            UserInfoManager.getInstance().setUser(loginUseInfo);
            if (loginUseInfo != null) {
                UserInfoManager.getInstance().setUser(loginUseInfo);
            }
        }
        return true;
    }


    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        UserInfoManager.getInstance().clear();
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
    }

    private String getCookieToken(HttpServletRequest request) {
        Cookie[] cookies = request.getCookies();
        if (cookies != null) {
            Cookie[] var3 = cookies;
            int var4 = cookies.length;

            for (int var5 = 0; var5 < var4; ++var5) {
                Cookie cookie = var3[var5];
                String name = cookie.getName();
                if ("ai-jwt-token".equals(name)) {
                    String value = cookie.getValue();
                    if (Strings.isNotBlank(value)) {
                        return value;
                    }
                }
            }
        }

        return null;
    }

    private boolean needLoginCheck(HttpServletRequest request) {
        String uri = request.getRequestURI();
        if (uri.contains(".")) {
            String suffix = uri.substring(uri.lastIndexOf(".") + 1);
            List<String> resources = Arrays.asList("map,json,xml,ts,js,css,less,sass,scss,jpeg,jpg,png,gif,bmp,svg,ttf,eot,woff,woff2".split(","));
            if (StringUtils.isNotBlank(suffix) && resources.contains(suffix.toLowerCase())) {
                return false;
            }
        }

        List<String> uncheckUrls = this.jwtSsoProperties.getUncheckUrls();
        if (uncheckUrls == null) {
            return true;
        } else {
            Iterator var7 = uncheckUrls.iterator();

            String uncheckUrl;
            do {
                if (!var7.hasNext()) {
                    return true;
                }

                uncheckUrl = (String) var7.next();
            } while (!this.antPathMatcher.match(uncheckUrl, uri));

            return false;
        }
    }
}

JWT原理

jwt组成

  • Header
  • Payload
  • Signature

jwt组成形式xxxxx.yyyyy.zzzzz

head

head部分json表明类型以及签名的算法例如HMAC或者SHA256或者RSA,在使用base64加密算法进行加密组成token的第一个部分

{
  "alg": "HS256",
  "typ": "JWT"
}

payload

token里面的一些声明既claim可以存入其中,例如一些用户信息在经过base64加密组成token的第二部分

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}

Signature

生成方式,将header base64加密,payload base64加密拼接,使用HMACSHA256指定盐进行加密再进行base64加密返回字符串

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

自己生成token DEMO

package com.demo.jwt;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.sun.org.apache.xml.internal.security.utils.Base64;
import org.junit.Test;
import org.springframework.util.Base64Utils;

import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;


/**
 * @description:
 * @author: Mr.Wang
 * @create: 2021-11-06 09:55
 **/

public class JwtTest {
    String charset = "utf-8";
    /*
    * 盐
    * */
    String key = "123";
    /*
    * 自己模拟生成jwt的token
    * */
    @Test
    public void testMyJwt() throws Exception{
        JSONObject originalhead = new JSONObject();
        originalhead.put("type","JWT");
        originalhead.put("alg","HS256");
        String header = Base64Utils.encodeToUrlSafeString(originalhead.toJSONString().getBytes(charset));
//      获取payload
        JSONObject originalPayload = new JSONObject();
        User user = new User();
        user.setName("aaa");
        originalPayload.put("userinfo", JSON.toJSON(user));
        String payload = Base64Utils.encodeToUrlSafeString(originalPayload.toJSONString().getBytes(charset));
//        获取signature
        String signature = hmacSha256Encode(header,payload);
        String token = String.format("%s.%s.%s",header,payload,signature);
        System.out.println(token);

    }
    public String hmacSha256Encode(String header,String payload) throws Exception {
//        获取摘要算法的对象
        Mac hmac256 = Mac.getInstance("HmacSHA256");
//        指定算法的key
        SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(charset),"HmacSHA256");
        hmac256.init(secretKeySpec);
        hmac256.update(header.getBytes(charset));
        hmac256.update(".".getBytes(charset));
        byte[] bytes = hmac256.doFinal(payload.getBytes(charset));
        return Base64.encode(bytes);
    }
}

运行结果
在这里插入图片描述

补充JWT使用redis续约方案

https://blog.youkuaiyun.com/weixin_39255905/article/details/115201764?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163713902416780269871323%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=163713902416780269871323&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~rank_v31_ecpm-18-115201764.pc_search_result_cache&utm_term=token%E7%BB%AD%E7%BA%A6%E4%B8%8D%E7%94%A8redis&spm=1018.2226.3001.4187

jwt在线生成网站 在线生成 JWT token的网站 https://dinochiesa.github.io/jwt/ 这是一个非常棒的一个Jwt token在线生成/编码/解码网站. 支持对称算法和非对称算法, 甚至可以生成 RSA 的public/private key. 关于 playload 中各个字段的说明: "payload": { "iss": "some auth server", // 颁... 阅读详情

相关推荐

jwt生成token

1 基于传统的session认证 http本身是一种无状态的协议,而这就意味着如果用户向我们的应用提供了用户名和密码来进行用户认证,那么下一次请求时,用户还再一次进行用户认证。因为根据http协议,我们不知道是哪个用户发出的请求,所以为了能让我们应用识别是哪一个用户发出的请求,我们只能在服务器端存储一份用户登录的信息,这份登录信息会在响应时传递给浏览器。告诉其保存为cookie,以便下次请求时发送给我们的应用,这样我们的用户就能识别是哪一个用户了,这就是传统的基于session认证。 当...

爪哇人的博客 1万+

JWTToken在线编码生成

JWTToken在线编码生成 JWTToken在线编码生成 JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案。本工具提供在线编码的功能 JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案。本工具提供在线编码的功能 JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案。本工具提供在线编码的功能 https://tooltt.com/jwt-encode/ ...

Linux,Java,SpringBoot,Python,Lua略知一点 8977

Java使用JWT实现Token认证机制

JWT(JSON Web Token)是一种用于在网络上安全地传输信息的简洁的、URL 安全的表示方法,它定义了一个紧凑且自包含的方式,用于不同实体之间安全地传输信息(JSON格式)。JWT 通常由三部分组成,分别是 Header(头部)、Payload(有效载荷)和 Signature(签名)。JWT是一种简单、安全、便捷的身份验证和授权机制,在现代Web应用程序中得到广泛应用。然而,在使用JWT时也需要注意其安全性问题,并采取相应的措施来确保JWT的安全性和完整性。

pan_junbiao的博客 2726

Jmeter生成JWT token

JSON Web令牌(JWT)是一个开放标准(RFC 7519),它定义了一种紧凑而自包含的方式,用于在各方之间以JSON对象的形式安全地传输信息。此信息可以验证和信任,因为它经过了数字签名。JWT可以使用密钥(使用HMAC算法)或使用RSA或ECDSA的公钥/私钥对进行签名。JSON Web令牌由三个部分组成,即:Header、Payload、Signature,这三者由两个点(.)分隔开。通常JWT展示为:Header.Payload.Signature。Header。

weixin_45531218的博客 2753

JWT库生成Token的使用与原理

现在开发前后端分离的系统或者开发 APP 的项目时,在验证用户是否登录时都会使用 Token 的方式,使用 Token 也是为系统后续可以进行拆分的第一步。 Token 的生成规则可以任意,只要最终可以通过 Token 去匹配到合适的用户即可。不过我们可以使用 JWT 类库来帮助我们生成 Token。JWT 是 Json Web Token 的意思,是一种通过 Json 格式在 Web 中进行传递的 Token。 JWT 的使用 先来看看关于 JW...

码农UP2U 1527

JWT生成token总结

学而时习之,不亦说乎。Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).定义了一种简洁的,自包含的方法用于通信双方之间以JSON对象的形式安全的传递信息。因为数字签名的存在,这些信息是可信的,JWT可以使用HMAC算法或者是RSA的公私秘钥对进行签名。 JWT的请求流程如下: 1. 用户使用账号和面发出pos...

唐震宇的博客 3060

jwt判断token是否过期_警钟 | 还不会Spring Boot集成JWT,你可能错过了大厂的Office了...

概述(什么是JWT)JWT是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准。该标准定义了一种简单的,自包含的,用于通信双方以JSON对象的形式安全的传递信息。请求流程流程如下用户使用账号和面发出 post 请求;服务器使用私钥创建一个 jwt;服务器返回这个 jwt 给浏览器;浏览器将该 jwt 串在请求头中像服务器发送请求;服务器验证该 jwt;返回响应的资源给浏览器。...

weixin_39587822的博客 1557

JWT令牌生成器:简单实现与安全认证

JSON Web Token(JWT)是一种开放标准(RFC 7519),用于在网络应用环境间安全地传输信息。这种信息可以被验证和信任,因为它既紧凑又自包含。在Web应用中正确地应用JWT令牌,需要精心选择存储机制和携带方式。在这一过程中,了解不同的存储方式和它们对安全性的影响至关重要。从存储方式的比较中可以看出,每种方式都有其适用场景和潜在的风险,开发者需要根据应用的具体需求做出合理的选择。同时,注意令牌的传输方式,确保整个流程的安全性。

weixin_42577735的博客 943

jwt

文章目录介绍JWT的验证过程实例 在之前的项目中,大部分网页是通过session来判断用户是否有权限来访问个别网页的,但是如果是SPA项目的话,前后端分离,客户请求的是前端,所以并不会保存数据到session,那该怎么办呢? 针对这一问题,可以使用jwt来解决! 介绍 JWT也就是JSON Web Token(JWT),是目前最流行的跨域身份验证解决方案。 JWT的组成: 一个JWT实际上就是一个...

大屌的博客 9679

JWT Token生成及验证

JWT Token生成及验证:JSON WEB TOKEN,简单谈谈TOKEN的使用及在C#中的实现

Java本地AI推理初体验:Jlama+LangChain4j构建离线问答系统

Jlama 是专为 Java 生态设计的现代化大型语言模型(LLM)推理引擎,旨在让开发者无需依赖外部服务即可直接在 Java 应用中运行本地化模型推理。本文将结合Jlama + langchain4j 实现一个本地可运行的简单问答Demo。

2501_92589102的博客 407

jwt私钥和公钥怎么获取_一文讲解JWT用户认证全流程

一、什么是JWT(what)JWT(JSON Web Token)是一个开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,以JSON对象的形式在各方之间安全地传输信息。JWT是一个数字签名,生成的信息是可以验证并被信任的。使用密钥(使用HMAC算法)或使用RSA或ECDSA的公钥/私钥对JWT进行签名。JWT是目前最流行的跨域认证解决方案1.1 JWT令牌结构SON Web令牌以紧凑的...

weixin_39949889的博客 2894

(25.08)Ubuntu20.04+ROS1复现FAST-LIO2

请确保在。

m0_69023437的博客 3992

Jwt

JWT是什么 JSON Web Token (JWT),它是目前最流行的跨域身份验证解决方案 为什么使用JWT JWT的精髓在于:“去中心化”,数据是保存在客户端的。 JWT的工作原理 是在服务器身份验证之后,将生成一个JSON对象并将其发送回用户,示例如下: {“UserName”: “Chongchong”,“Role”: “Admin”,“Expire”: “2018-08-...

weixin_45180919的博客 150

高性能网站设计之缓存更新的套路

看到好些人在写更新缓存数据代码时,先删除缓存,然后再更新数据库,而后续的操作会把数据再装载的缓存中。然而,这个是逻辑是错误的。试想,两个并发操作,一个是更新操作,另一个是查询操作,更新操作删除缓存后,查询操作没有命中缓存,先把老数据读出来后放到缓存中,然后更新操作更新了数据库。于是,在缓存中的数据还是老的数据,导致缓存中的数据是脏的,而且还一直这样脏下去了。 我不知道为什么这么多人用的都是这

代码技巧 1万+

车辆横向控制MPC实战:从‘老王模型’到CasADi求解的保姆级避坑指南

本文详细解析了车辆横向控制MPC的实战应用,从经典动力学模型选择到CasADi求解器的优化配置,提供了一套完整的避坑指南。重点介绍了车辆动力学模型的验证要点、CasADi环境的高效配置技巧以及MPC问题建模的核心要素,帮助开发者快速实现稳健的横向控制方案。

weixin_42524499的博客 346

jwt的加密原理,和token的简单操作

1. 两种token认证方式 传统的token认证 用户登录,服务端给前端返回token,并将token保存在服务端。 以后用户再来访问时,需要携带token,服务端获取token后再去数据库获取token做校验。 JWT的token认证 用户登录,服务端给用户返回一个token(服务端不保存) 以后用户再来访问时,需要携带token,服务端获取token做校验 两种认证方式对比: jwt相对于传统的token认证,无需将token保存在服务端。 因为HTTP request 本身是stateless的,所

qq_51705526的博客 1万+

Linux V4L2驱动开发实战:手把手教你用I2C摄像头Sensor注册一个v4l2_subdev

本文详细解析了Linux V4L2驱动开发中I2C摄像头Sensor注册v4l2_subdev的全流程,包括初始化、操作集填充、异步匹配等关键环节。通过实战案例和代码示例,帮助开发者掌握V4L2子系统下的摄像头驱动开发技巧,提升嵌入式Linux系统开发能力。

weixin_30328063的博客 418

JWT实现token登录验证

Jwt是一种用于在各方之间安全地传输信息的开放标准(RFC 7519)。它可以被用于身份验证和信息交换,常见于Web应用中,以支持单点登录(SSO)或API身份验证。JWT 的内容可以通过数字签名保护,以确保信息的完整性和真实性。

m0_73641772的博客 6291

Golang内存管理:GC调优实战案例

在Golang编程中,内存管理是一个非常重要的方面。良好的内存管理可以提高程序的性能和稳定性,而GC(垃圾回收)调优则是优化内存管理的关键手段。本文的目的就是通过实际案例,深入讲解Golang中GC调优的方法和技巧,让读者能够在实际项目中更好地进行内存管理和性能优化。范围涵盖了从核心概念的解释到具体代码实现和调优过程的详细分析。本文首先会介绍一些相关的术语和核心概念,让读者对Golang内存管理和GC有一个基本的认识。然后通过故事引入的方式,更加形象地解释核心概念及其相互关系。

AI Agent Harness Engineering 1118

1553B总线介绍及其硬件方案设计

军用1553B总线 1.简介 简单介绍可参考(https://blog.youkuaiyun.com/ScilogyHunter/article/details/108444231)博主写的很详细。 1553B总线是MIL-STD-1553总线的简称,其中B就是BUS,MIL-STD-1553B总线是飞机内部时分制命令/响应式多路复用数据总线。1553B数据总线标准是20世纪70年代由美国公布的一种串行多路数据总线标准。1553B总线能挂31个远置终端,1553B总线采用指令/响应型通信协议,它有三种终端类型: BC:

小幽余生不加糖 1万+

使用JWT生成token

一、使用JWT进行身份验证 1、传统用户身份验证 Internet服务无法与用户身份验证分开。一般过程如下: 用户向服务器发送用户名和密码。 验证服务器后,相关数据(如用户角色,登录时间等)将保存在当前会话中。 服务器向用户返回session_id,session信息都会写入到用户的Cookie。 用户的每个后续请求都将通过在Cookie中取出session_id传给服务器。 服务器收到session_id并对比之前保存的数据,确认用户的身份。 这种模式最大的问题是,没有分布式架构,无

zjjcchina的博客 1万+

手把手教你学Simulink--基于Simulink的高增益DC-DC变换器仿真建模

特点高电压增益:可以在不使用变压器的情况下实现较大的电压升压比。适用于低电压源:如太阳能电池板、燃料电池等提供的低压直流电源。效率问题:设计时需特别注意提高效率,减少能量损失。挑战电路复杂性:通常涉及多个电感和电容,以及复杂的开关模式。元件选择:合适的元件参数对于达到理想性能至关重要。控制策略:确保高效稳定运行的同时,适应负载变化。首先明确要模拟的任务内容。实现特定的电压增益比(例如从24V升至380V)。根据预期的输入输出电压确定合适的电路拓扑和元件值。

MHD0815的博客 173

利用JWT生成Token的原理及公钥和私钥加密和解密的原则

开篇: 实现Token的方式有很多,本篇介绍的是利用Json Web Token(JWT)生成的Token.JWT生成的Token有什么好处呢? 安全性比较高,加上密匙加密而且支持多种算法。 携带的信息是自定义的,而且可以做到验证token是否过期。 验证信息可以由前端保存,后端不需要为保存token消耗内存。 小知识:Base64是一种编码,也就是说,它是可以被翻译回原来的样子来的。它并不是一...

weixin_42030357的博客 3万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

JWT生成Token

有状态服务,即服务端需要记录每次会话的客户端信息,从而识别客户端身份,根据用户身份进行请求的处理,典型的设计如tomcat中的session。例如登录:用户登录后,我们把登录者的信息保存在服务端session中,并且给用户一个cookie值,记录对应的session。然后下次请求,用户携带cookie值来,我们就能识别到对应session,从而找到用户的信息。缺点是什么?服务端保存大量数据,增加服务端压力服务端保存用户状态,无法进行水平扩展客户端请求依赖服务端,多次请求必须访问同一台服务器。

zhuge_long的专栏 2144

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

上一篇: rocketmq 客户端消息生产消费Demo测试
下一篇: nginx部署
Persistence___
博客等级 码龄8年 47粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值