JWT简介、JWT优缺点、JWT使用方法、.NET6使用JWT示例、JWT与Session对比

JWT(JSON WEB TOKEN)详解 JWT(JSON WEB TOKEN),本文主要详细讲解了jwt,从其定义、token的理解、结构、使用等等帮助深刻理解jwt。 阅读详情

一、JWT简介

JWT(Json Web Token)是一种可以跨域的认证方案。

构成:

  1. 头部Header:头部包含了两部分,token 类型和采用的加密算法(可为none,后端应限制加密算法,不以这里为准)。
  2. 载荷Payload:这部分才是重要的,可以自定义信息保存在此。
  3. 签名Signature:使用编码后的header和payload以及我们提供的一个密钥,然后使用header中指定的签名算法进行签名,签名的作用是保证JWT没有被篡改过,如果有人对头部以及负载的内容解码之后进行修改,再进行编码,最后加上之前的签名组合形成新的JWT的话,那么服务器端会判断出新的头部和负载形成的签名和JWT附带上的签名是不一样的。如果要对新的头部和负载进行签名,在不知道服务器加密时用的密钥的话,得出来的签名也是不一样的。

这三部分均用base64进行编码,并使用 . 进行分隔。一个典型的 JWT 格式的 token 类似xxxxx.yyyyy.zzzzz。

JWT对三个部分都使用的是Base64进行编码,但是Base64是可逆的,所以注意在Payload部分不要携带敏感信息。

特点:

  • 简洁(Compact) : 可以通过URL,POST参数或者在HTTP header发送,因为数据量小,传输速度也很快。
  • 自包含(Self-contained) :负载中包含了所有用户所需要的信息,避免了多次查询数据库。

核心优势:无状态

  • 省事,解析完token把信息放在处理链路的上下文,不用去redis或者database去取了。
  • 省时,用每个请求验证token慢一点点的代价,换来不用去存储取的优势。

二、JWT优缺点

JWT优点:

  • 因为json的通用性,JWT是可以跨语言支持的,像JAVA,JavaScript,NodeJS,PHP等语言都能使用。
  • 因为有了payload部分,所以JWT可以在自身存储一些其他业务逻辑所必要的非敏感信息。
  • 便于传输。JWT的构成非常简单,字节占用很小,所以它是非常便于传输的。
  • 它不需要在服务端保存会话信息, 所以它易于应用的扩展。

JWT缺点:

  • 占带宽: 正常情况下要比 session_id 更大,需要消耗更多流量,挤占更多带宽,假如你的网站每月有 10 万次的浏览器,就意味着要多开销几十兆的流量。听起来并不多,但日积月累也是不小一笔开销。实际上,许多人会在 JWT 中存储的信息会更多。
  • 无法在服务端注销。用户主动注销时一般会让前端清理token,后端不理会,很难解决劫持问题。其他解决办法都是有状态的,例如通过Redis存储token副本、Redis存储token版本号、Redis存储过期时间等。
  • 性能问题: JWT 的卖点之一就是加密签名,由于这个特性,接收方得以验证 JWT 是否有效且被信任。但是大多数 Web 身份认证应用中,JWT 都会被存储到 Cookie 中,这就是说你有了两个层面的签名。听着似乎很牛逼,但是没有任何优势,为此,你需要花费两倍的 CPU 开销来验证签名。对于有着严格性能要求的 Web 应用,这并不理想,尤其对于单线程环境。

安全建议:

  • 保证密钥的保密性
  • 签名算法固定在后端,不以JWT里的算法为标准
  • 避免敏感信息保存在JWT中
  • 尽量让JWT的有效时间足够短

三、JWT使用流程

  • 首先,前端通过Web表单将自己的用户名和密码发送到后端的接口。这一过程一般是一个HTTP POST请求。建议的方式是通过SSL加密的传输(https协议),从而避免敏感信息被嗅探。
  • 后端核对用户名和密码成功后,将用户的id等其他信息作为 JWT-Payload(负载),将其与头部分别进行Base64编码拼接后签名形成一个JWT。形成的JWT就是一个形同111.zzz.xxx的字符串。
  • 后端将JWT字符串作为登录成功的返回结果返回给前端。前端可以将返回的结果保存在localStorage或sessionStorage上,退出登录时前端删除保存的JWT即可。
  • 前端在每次请求时将JWT放入HTTP Header中的Authorization位。(解决XSS和XSRF问题)
  • 后端检查是否存在,如存在验证JWT的有效性。例如,检查签名是否正确;检查Token是否过期;检查Token的接收方是否是自己(可选)。
  • 验证通过后后端使用JWT中包含的用户信息进行其他逻辑操作,返回相应结果。

四、.NET6使用JWT

开启JWT身份认证,开发登录接口,在需要身份认证的接口上增加 [Authorize] 特性,若不需要身份认证,添加 [AllowAnonymous] 特性即可。

代码示例:

appsettings.json

  "JwtConfig": {
    "SecretKey": "5610703d-d774-2b4b-836e-996ada2bb75b", // 密钥
    "Issuer": "wuyun", // 颁发者
    "Audience": "user", // 接收者
    "Expired": 1 // 过期时间(30min)
  },

program.cs(.NET6与老版本略有差异)

#region JWT验证
builder.Services.AddScoped<JwtService>();
builder.Services.Configure<JwtConfig>(builder.Configuration.GetSection("JwtConfig"));

var jwtConfig = new JwtConfig();
builder.Configuration.Bind("JwtConfig", jwtConfig);

//认证(Authentication)中间件配置
builder.Services.AddAuthentication(options =>
{
    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(options =>
{
    options.RequireHttpsMetadata = false;
    options.SaveToken = true;
    options.TokenValidationParameters = new TokenValidationParameters
    {
        ValidateIssuer = false,//是否验证Issuer
        ValidateAudience = false,//是否验证Audience
        ValidateIssuerSigningKey = true,//是否验证SigningKey
        ValidateLifetime = true,//是否验证Token有效期(使用当前时间与Token的Claims中的NotBefore和Expires对比)
        ValidIssuer = jwtConfig.Issuer,//Issuer(Token颁发机构)
        ValidAudience = jwtConfig.Audience,//Audience(颁发给谁)
        IssuerSigningKey = new SymmetricSecurityKey(System.Text.Encoding.UTF8.GetBytes(jwtConfig.SecretKey)),//这里的key要进行加密
        ClockSkew = TimeSpan.FromSeconds(0),//缓冲时间:不设置的话默认为5分钟。注意:有效时长 = 过期时间 + 缓冲时间
        RequireExpirationTime = true,//是否必须设置过期时间
    };
});
#endregion

var app = builder.Build(); // 构建App实例

app.UseCors("CorsPolicy"); // 启用跨域策略
app.UseAuthentication(); // 启用认证(先认证后授权,否则带了token也认证不通过)
app.UseAuthorization(); // 启用授权

app.Run(); // 运行App并阻塞调用线程直到宿主关闭

JwtConfig.cs

/// <summary>
/// jwt配置
/// </summary>
public class JwtConfig : IOptions<JwtConfig>
{
    public JwtConfig Value => this;
    public string SecretKey { get; set; }
    public string Issuer { get; set; }
    public string Audience { get; set; }
    public int Expired { get; set; }
    public DateTime NotBefore => DateTime.UtcNow;
    public DateTime IssuedAt => DateTime.UtcNow;
    public DateTime Expiration => IssuedAt.AddMinutes(Expired);
    private SecurityKey SigningKey => new SymmetricSecurityKey(Encoding.UTF8.GetBytes(SecretKey));
    public SigningCredentials SigningCredentials => new SigningCredentials(SigningKey, SecurityAlgorithms.HmacSha256);
}

JwtService.cs

/// <summary>
/// 创建JWT工具类
/// </summary>
public class JwtService
{
    private readonly JwtConfig _jwtConfig;
    public JwtService(IOptions<JwtConfig> jwtConfig)
    {
        _jwtConfig = jwtConfig.Value;
    }

    /// <summary>
    /// 生成token
    /// </summary>
    /// <param name="sub">token主题</param>
    /// <param name="customClaims">携带的用户信息</param>
    /// <returns></returns>
    public string GetToken(string sub, UserInfoBriefDto customClaims)
    {
        // C1aim部分包含了一些跟这个token有关的重要信息。JWT标准规定了一些字段,下面节选一些字段:
        // iss: The issuer of the token.(token是给谁的)
        // sub: The subject of the token.(token主题)
        // exp: Expiration time.(token过期时间,Unix时间戳格式)
        // iat: Issued at.(token建时间,Unix时间盛格式)
        // jti: JWT ID.(针对当前token的唯一标识)
        // 除了规定的字段外,可以包含其他任何兼容的字段。

        //创建用户身份标识,可按需要添加更多信息
        var claims = new[]
        {
            new Claim("userid", customClaims.UserId),
            //new Claim("username", customClaims.UserName),
            //new Claim("roles", string.Join(";",customClaims.Roles)),
            new Claim(JwtRegisteredClaimNames.Sub, sub),
        };
        //创建令牌
        var jwt = new JwtSecurityToken(
            issuer: _jwtConfig.Issuer,
            audience: _jwtConfig.Audience,
            claims: claims,
            notBefore: _jwtConfig.NotBefore,
            expires: _jwtConfig.Expiration,
            signingCredentials: _jwtConfig.SigningCredentials);
        return new JwtSecurityTokenHandler().WriteToken(jwt);
    }

    public LoginResult GetResultWithToken(string sub, UserInfoBriefDto customClaims)
    {
        return new LoginResult()
        {
            access_token = GetToken(sub, customClaims),
            //refresh_token = Guid.NewGuid().ToString(), // 配合Redis使用
            expires_in = _jwtConfig.Expired * 60,
            token_type = JwtBearerDefaults.AuthenticationScheme,
            //user = customClaims
        };
    }
}

UserController.cs

/// <summary>
/// 用户登录
/// </summary>
[HttpPost(Name = "Login")]
[AllowAnonymous]//不需要身份验证
public IActionResult Login(UserLoginReq request)
{
    //判断用户名和密码是否正确(仅为示例)
    if (request.UserName != "admin" || request.Password != "111111")
    {
        return BadRequest("用户名或密码不正确!");
    }
    UserInfoBriefDto user = new UserInfoBriefDto() { UserId = "100001", UserName = request.UserName, Roles = request.UserName };
    LoginResult loginResult = _jwtService.GetResultWithToken("user_login", user);//签发token并整合登录返回信息
    return Ok(loginResult);
}

五、JWT和Session对比

存储id的差异:

Session方式存储用户id的最大弊病在于Session是存储在服务器端的,所以需要占用大量服务器内存,对于较大型应用而言可能还要保存许多的状态。一般而言,大型应用还需要借助一些KV数据库和一系列缓存机制来实现Session的存储。

而JWT方式将用户状态分散到了客户端中,可以明显减轻服务端的内存压力。除了用户id之外,还可以存储其他的和用户相关的信息,例如该用户是否是管理员、用户所在的分组等。虽说JWT方式让服务器有一些计算压力(例如加密、编码和解码),但是这些压力相比磁盘存储而言可能就不算什么了。具体是否采用,需要在不同场景下用数据说话。

Session方式来存储用户id,一开始用户的Session只会存储在一台服务器上。对于有多个子域名的站点,每个子域名至少会对应一台不同的服务器,例如:www.taobao.com,nv.taobao.com,nz.taobao.com,login.taobao.com。所以如果要实现在login.taobao.com登录后,在其他的子域名下依然可以取到Session,这要求我们在多台服务器上同步Session。使用JWT的方式则没有这个问题的存在,因为用户的状态已经被传送到了客户端。

使用Session的缺点:

  • 占用服务端内存;
  • 扩展性差(跨域难解决,不利于分布式);
  • 基于Cookie,容易受到CSRF(跨站请求伪造)攻击。
.net6 基本使用JWT生成Token,模拟用户登录,启动api授权,需要登录携带token才能请求数据,基本给用户添加权限管理 1. 创建好项目,添加一个控制器,新建用户登录api接口和接收用户登录信息类Dto Dto就包含两个字段,账号和密码 2. 安装NuGet包,搜索JWT,安装图下这个包 3. 在appsettings.json添加JWT加密需要的私钥,发布者等相关配置信息,私钥用户可以自定义。 私钥:SecretKey 发布者:Issuer 接收者:Audience "Authentication": { "SecretKey": "nadjhfgkadshgoihfkajhkjdhsfaidkuahfh 阅读详情

相关推荐

JWT - 令牌认证(认证流程和原理、Jwt 工具类、搭配 Redis 使用)

1. 首先前端将用户名和密码发送给后端,后端对用户名和密码校验成功后,会将用户 id 和其他信息作为 payload ,然后将其分别进行 Base64 编码,拼接,最后再签名,形成一个 JWT(Token). 形成的 JWT 就形同 xxx.yyy.zzz 这种结构的字符串.http 协议是一种无状态的协议,也就意味着当用户第一次通过用户名和密码登录成功以后,下一次再请求的时候,用户还需要再进行登录才行,因为根据 http 协议,我们不能知道是哪个用户发出的请求.

CYK_byte的博客 2万+

什么是JWT?(细致讲解)

什么是JWT?传统的session、token认证、JWT登录鉴权

Ethereal的博客 8万+

.Net Core 集成JWT授权验证 从页面到API详解

.Net Core集成JWT授权验证,创建项目、配置项目、控制器页面、页面提交、API处理全过程详解

商务合作 / 项目定制 / 学习交流。个人vx:lovely_wml 2861

JWT简介& JWT结构& JWT示例& 前端添加JWT令牌功能& 后端程序

Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。JSON Web Token(JWT)是目前最流行的跨域身份验证解决方案。

qq_73126462的博客 1万+

【FPGA的基础快速入门23--------OV5640摄像头VGA显示】

FPGA的基础学习--------OV5640摄像头VGA显示OV5640简介二级目录三级目录 OV5640简介 OV5640同OV7725一样,都是Omni Vision(豪威科技)公司生产的CMOS图像传感器。 OV5640支持更高的分辨率(500W像素)、采集速率,具有更高的图像处理性能,主要应用在手机、数码相机、电脑多媒体等领域。 OV5640支持LED补光、MIPI(移动产业处理器接口)输出接口和DVP(数字视频并行)输出接口选择、ISP(图像信号处理)以及AFC (自动聚焦控制)等功能。 OV

暮雨中的坚果的博客 7688

手机摄影新宠:In-line Hardware EIS如何让你的4K视频稳如鸡头(附实测对比)

本文深入解析了手机摄影中的In-line Hardware EIS(硬件级行内电子图像稳定)技术。通过对比传统软件EIS,阐述了其通过硬件管道实时处理实现极低延迟、减少画面裁切和有效抑制果冻效应的核心优势,并结合4K视频的日夜间实测,展示了该技术如何让手持拍摄的视频“稳如鸡头”,显著提升创作体验与成片质量。

tree的博客 994

asp.net mvc使用JWT代替session,实现单点登陆

使用JWT取代session,实现单点登陆1. 什么是Token?2. 什么是JWT?3. Token与Session比较传统Session所暴露的问题Token的验证机制4. ASP.NET MVC如何使用jwt实现单点登陆 1. 什么是Token? 什么是token?token可以理解为是一种令牌,常用在计算机身份认证。在与服务器进行数据传输之前,会进行身份核验。 2. 什么是JWT? 什么是...

i李泳谦谦谦谦谦 1万+

双翌视觉系统配合机械手大视野定位案例(单目标带角度抓取)

一、定位原理概述 1.系统构架 视觉定位系统采用正向打光方式,光源在机械手上方,CCD从上往下拍摄,进行图像分析定位。相机将计算出的像素坐标转换为机械手的物理坐标,视觉软件与机械手进行网口通讯,将视野内物料的物理坐标发送给机械手,机械手抓取物料放在指定工位。 2.相机标定概述 系统采用宫格标定确定像素坐标和物理坐标一一对应关系,同时利用3点或者多点旋转标定求出旋转中心 系统采用宫格标定,自定义行列数和间距及旋转角度,通过机械手发送的当...

weixin_51554164的博客 2171

token登录验证机制与session登录验证机制的优缺点

首先我们需要来了解token和session登录验证的过程 token登录验证机制 前几天研究了一下springboot security的一个项目,分析了源码,里面就是在使用token的登录验证机制,主要使用过程如上图,登录后根据security的安全算法生成一个唯一的token值(基于JWT),然后存储到redis中,并设定过期时间,之后把token值返回前台,前台保存到localStora...

清风丨的博客 1万+

STM32--LoRa通信模块

模块根据MD0的配置与AUX引脚的状态会进入不同的功能其中在通信功能下,包含4种工作模式。

qq_47258284的博客 1万+

别再只盯着DDR5了!聊聊3D DRAM:它凭什么能解决AI算力的内存墙难题?

本文深入探讨了3D DRAM技术如何突破AI算力的内存墙限制。通过立体堆叠架构,3D DRAM在存储密度、带宽和延迟方面实现显著提升,有效解决AI训练和推理中的内存瓶颈问题。文章还分析了三星、SK海力士等巨头的技术路线图,并指出商业化面临的挑战与机遇。

weixin_42685438的博客 188

.NET Core使用JWT做授权鉴权

Microsoft.AspNetCore.Authentication.JwtBearer,可以让应用接收Bearer Token的一个http://ASP.NET Core中间件。AuthenticateController用于实现用户的登陆,生成JWT Token并返回给用户,OrderController用于对用户权限进行测试。

weixin_49336442的博客 3171

VTK:受约束的 Delaunay 2D用法实战

VTK:受约束的 Delaunay 2D用法实战程序输出程序完整源代码 程序输出 程序完整源代码 #include <vtkActor.h> #include <vtkCellArray.h> #include <vtkDelaunay2D.h> #include <vtkMath.h> #include <vtkMinimalStandardRandomSequence.h> #include <vtkNamedColors.h>

希望我的博客,能帮上你解决学习中工作中所遇到的问题 940

ASP.NET Core Web API 实现 JWT 身份验证

ASP.NET Core Web API 实现 JWT 身份验证

R3333355726856的博客 2218

C#上位机通信层封装:西门子S7NetPlus库的优雅使用

支持S7-1200/1500(机架号0,槽号1)、S7-300/400(机架号/槽号需根据实际配置);支持位(Bit)、字节(Byte)、字(Word)、双字(DWord)、浮点数(Float/Double)等数据类型的读写;支持DB块、输入寄存器(I)、输出寄存器(Q)、内存寄存器(M)、定时器(T)、计数器(C)的操作;轻量无依赖,兼容.NET 5+。首先定义核心枚举和常量,统一规范参数类型,避免硬编码。/// 西门子PLC型号(对应不同的机架/槽号默认配置)

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1085

PostgreSQL面试题及详细答案120道(101-120)

本文针对PostgreSQL数据库提供全面的性能优化方案,涵盖10个关键面试题解析。主要内容包括:1)并发参数调优(max_connections、worker_processes);2)缓存设置(effective_cache_size);3)WAL日志优化;4)慢查询监控与日志配置;5)会话管理与阻塞处理;6)高写入场景优化策略;7)存储类型参数调整;8)自动清理机制配置;9)大表DDL操作避坑指南;10)性能瓶颈诊断方法论。对DBA和开发者具有实操指导价值

大剑师兰特的GIS世界 855

ASP.NET Core高级之认证与授权(二)--JWT认证前后端完整实现

本文是一个基于JWT认证的完整的前后端实现代码案例。

物联网大联盟 3912

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

php session 和 jwt 区别和使用场景

摘要: PHP中的session和JWT是两种用户身份验证技术,主要区别在于: 存储方式:session数据存储在服务器端,客户端仅传递session ID;而JWT以令牌形式存储在客户端,包含用户信息。 扩展性:session在分布式系统中需共享存储(如Redis),而JWT无需服务器存储,适合微服务架构。 安全性:session依赖ID防伪造,JWT通过签名防篡改,但需注意令牌有效期。 适用场景:session适合传统单体应用;JWT更适用于前后端分离、移动应用及微服务。 选择时需权衡架构需求、安全性及

滴水石穿 1036

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

ASP.NET Core Web Api之JWT VS Session VS Cookie(二)

本文我们来探讨下JWT VS Session的问题,我们可直接抛出问题:使用客户端存储的JWT比服务端维持Session更好吗?既然要比较JWT VS Session,...

dotNET跨平台 420

TP6框架下JWT与Session混合认证方案:原理、实现与安全实践

在Web与移动应用开发中,用户认证是保障系统安全的核心环节。传统的Session机制通过在服务端存储会话状态实现认证,其优点是服务端可控性强,但存在扩展性挑战。而JWT(JSON Web Token)作为一种无状态令牌技术,将用户信息编码进Token本身,通过签名保证其完整性,天生适合分布式系统和API接口。其技术价值在于解耦了认证状态与服务器存储,提升了系统的扩展性和移动端友好性。然而,JWT的‘无状态’特性也带来了令牌无法主动失效的安全挑战。因此,在实际工程中,常采用混合认证模式,在TP6等主流框架中结

weixin_30730053的博客 390

jwt在ASP.NET MVC下的token用法

[转载]Json Web Token(jwt) 一种不错的身份验证及授权方案,与 Session 相反,Jwt 将用户信息存放在 Token 的 payload 字段保存在客户端,通过 RSA 加密的方式,保证数据不会被篡改,验证数据有效性。 详细请参考jwt.io。 本文在转载文上做了一些修改,避免初学者走弯路,以下文章中有介绍设置过期时间,还有,token仔细...

r2673673120的专栏 4053

Swagger使用 JWT认证授权

ASP.NET Core WebApi使用Swagger生成api说明文档看这篇就够了 - 依乐祝 - 博客园 cookie、session、token、OAuth 参考网址:授权认证登录之 Cookie、Session、Token、JWT 详解 - 黄金国的大象 - 博客园 .Net5 Core 配置 Swagger 并进行全局Token添加 - lilyshy - 博客园 视频学习:【Asp.NetCoreWebApi】开发实战完整带源码(集成日志/搭建服务器实例集群/Jwt鉴权授权/Filt..

酷悦悦 2669

JWT(代替Session会话)

经典的保持登陆状态的办法是Session,也就是用户登陆后,服务器产生唯一标识SessionId,并把SessionId和登陆的用户信息保存在服务器内存中,通时将SessionId发送给浏览器(),当浏览器再次访问的时候,http请求中便携带了SessionId,服务器根据该Id在内存中取到用户信息,这样就实现了登陆功能功能。1:如果Session保存在内存中,当登陆用户多的时候,会占用服务器大量服务器内存,而且无法支持分布式集群。

qq_24769781的博客 521

ASP.NET Core JWT

JWT把登录信息(也称作令牌)保存在客户端。 为了防止客户端的数据造假,保存在客户端的令牌经过了签名处理,而签名的密钥只有服务器端才知道,每次服务器端收到客户端提交过来的令牌的时候都要检查一下签名。

Anoxia_li的博客 720
上一篇: WebAPI参数为string、int、double时怎么接收?WebAPI接收参数的方式
下一篇: 新手问题笔记:手机可以访问前端页面,但是无法获取后台数据;localhost引起后端访问路径错误,不是跨域问题
wingrant
博客等级 码龄15年 3粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值