springboot集成JWT生成token并自定义拦截器及解决拦截器失效问题

Springboot继承JWT配置拦截器导致swagger无法访问 在我的springboot项目中,继承jwt并且配置拦截器之后发现swagger无法正常访问,发现拦截器中只释放了登录页面路径。swagger路径依旧被拦截。 给拦截器中将swagger路径释放出来。 @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new TokenInterceptor()) //用于添加拦截规 阅读详情

1.导入jwt依赖

<dependency>
    <groupId>com.auth0</groupId>
    <artifactId>java-jwt</artifactId>
    <version>3.10.3</version>
</dependency>

2.配置拦截

/**
 * WebMvcConfig配置
 */
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(authenticationInterceptor())
                    .addPathPatterns("/**")
                    .excludePathPatterns("/user/login");
        }


    @Bean
    public AuthenticationInterceptor authenticationInterceptor() {
        //拦截器
        return new AuthenticationInterceptor();
    }

}

3.自定义拦截器

@Component
public class AuthenticationInterceptor  implements HandlerInterceptor  {


    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String token = request.getHeader("token");
        HashMap<String, Object> map = new HashMap<>();
        try {
            JwtUtils.verifyToken(token);
            return true;
        } catch (SignatureVerificationException e) {
            e.printStackTrace();
            map.put("msg","无效的签名");
        }catch (TokenExpiredException e){
            e.printStackTrace();
            map.put("msg","该令牌已过期");
        }catch (AlgorithmMismatchException e){
            e.printStackTrace();
            map.put("msg","算法不匹配");
        }catch (Exception e){
            e.printStackTrace();
            map.put("msg","token无效!");
        }
        map.put("status",false);
        String errorMsg = JSONObject.toJSONString(map);
        response.setContentType("application/json; charset=UTF-8");
        PrintWriter writer = response.getWriter();
        writer.print(errorMsg);
        writer.close();
        return false;
    }
}

4.添加@component是会报The bean ‘xxx’, defined in class path resource [com/uniedu/frame/swagger2/Swagger2Configuration.class], could not be registered. A bean with that name has already been defined in class path resource

5.解决方法

 

main:
  allow-bean-definition-overriding: true

6.测试

@PostMapping("/login")
@ResponseBody
private Msg getToken(@RequestBody Msg msg){
    HashMap<String, String> claim = new HashMap<>();
    claim.put("id","PVor7HsCjhtwmmrewNrXh9UeO2zy4pWZ");
    claim.put("username","住户1");
    return new Msg().success(JwtUtils.getToken(claim));
}

 

 

Springboot+Jwt+Redis 完成Token登录认证 Springboot+Jwt+Redis 完成Token登录认证前言大致流程知识点一、Token二、JWT三、Redis实现部分引入依赖详细代码1.用户注册2.用户登录密码校验 前言 本章内容建立在Springboot 基础框架搭建好的基础上进行整合jwt+redis 实现token登录认证 大致流程 前端 :前端拿到登录名和密码,使用JSEncrypt实现rsa将密码进行加密(这个部分网上有很... 阅读详情

相关推荐

即梦文生视频逆向接口部署使用

有的小伙伴不知道这个地址如何填写,你可以理解是步骤3上提供的 服务器或者本地电脑IP 地址(不要写 http://127.0.0.1 或者http://localhsot ) 是 (192.168.XXX.XXX 参考)

weixin_44245188的博客 3185

SpringBoot 配置拦截器未生效

SpringBoot 配置拦截器未生效 在编写springboot拦截器实现jwt的案例时,由于开启了两个服务,其中一个服务的一个controller拦截器没有生效,现猜测可能原因有下: 1. @Component,@Configuration注解未加 2. @ComponentScan增加包扫描   3. 多个配置类只会生效前一个配置类,后一个配置类不会生效,所以解决方法就是在一个配置...

qq_36662478的博客 3737

HT7036计量芯片SPI通信与数据读取实战解析

本文详细解析HT7036计量芯片的SPI通信与数据读取实战,涵盖SPI时序配置、命令发送、数据读取及常见问题排查。重点介绍如何通过SPI接口与MCU通信,实现电能数据的稳定采集与处理,为智能电表等应用提供实用解决方案。

vscode5coder的博客 264

springboot 整合 JWT 和请求拦截,实现利用 token 做请求安全拦截校验,且实现阻止并发登录

springboot 整合 JWT 和请求拦截,实现利用 token 做请求安全拦截校验,且实现阻止并发登录

Johnson_7的博客 4286

Windows下MMdetection3D保姆级安装指南(含CUDA和PyTorch版本避坑)

本文提供Windows平台下MMdetection3D的完整安装指南,重点解决CUDA与PyTorch版本匹配问题。从环境准备到关键组件安装,详细介绍了CUDA Toolkit选择策略、PyTorch精准安装步骤,以及MM系列组件的安装顺序和常见错误解决方案,帮助用户顺利完成3D目标检测环境的配置。

weixin_42628941的博客 490

西门子PLC新手必看:200SMART与1200/1500的MODBUS RTU通讯实战(附完整配置流程)

本文详细解析了西门子PLC中S7-200 SMART与S7-1200/1500之间实现MODBUS RTU通讯的完整实战流程。内容涵盖硬件接线、软件配置及程序编写,重点讲解了200SMART作为从站、1200/1500作为主站的典型架构,并提供了关键功能块的使用方法和常见问题排查技巧,帮助新手快速打通不同系列PLC间的数据交换。

weixin_29214559的博客 395

java 中使用拦截器不生效的原因之一(纯踩坑)

excludePathPatterns("/zuodou/syslogin/login") // 排除用户登录请求。.addPathPatterns("/zuodou/**") //所有路径都被拦截。好吧,还是不熟悉,这里只是设置了上下文的路径,而拦截器只会拦截类对象配置的路径(我也没理解透)1.项目中有多个拦截器,需要配置执行顺序,.order(1) / @order(1)使用:addPathPatterns 设置的拦截路径只会拦截这个。建议:jwt拦截器直接拦截所有,其他不想拦截的就指定放开。

andrew_dear的博客 2252

Unity游戏开发:从零开始适配Nintendo Switch的完整指南

本文详细介绍了如何使用Unity进行Nintendo Switch游戏开发的完整流程,包括开发环境搭建、Unity工程适配、手柄与硬件特性开发、存储与性能优化等关键步骤。特别强调了Switch SDK的配置、输入系统改造和内存优化技巧,帮助开发者高效完成跨平台适配。

vodka的博客 1068

Springboot 前后端分离项目中使用拦截器获取不到token或者token为空的问题(OPTION请求被拦截问题)

目是前后端分离的,并且springboot也配置了跨域功能。但是配置了JWT功能、以及验证器验证之后却出现了获取不到jwt的问题。获取参数为 null。并且全局异常拦截失效,前端响应为cors跨域问题获取不到数据。使用postman可以正常请求并获取数据,考虑到是不是因为自己header中的jwt字段不是标准的header字段,尝试放到Authorization中也是null,并且全局拦截也是失效的。

weixin_45609613的博客 3260

【全网最新】使用 1panel面板 部署若依系统( springboot 和 vue)项目

打开前端项目的vue.config.js文件,检查devServer下的proxy代理部分,然后将下面这个端口修改为你要在打包后访问的端口,即使用nginx代理前的接口。这个端口默认是80端口,这里把其修改为不会冲突的8010端口,后台接口的地址配置为9080,不过感觉这里设置的8010和9080可能没有用,因为部署前端静态页面是,也配置了一次网页的外部接口和api的接口,后期有空了再验证。打开右侧的Maven,点击:生存期->package,然后点击运行,等待打包成功,包在如图所示的文件夹中。

老薛的专栏 1756

DEA-Malmquist指数模型实战:从理论到应用的全流程解析

本文全面解析了DEA-Malmquist指数模型从理论到应用的全流程。文章详细阐述了该模型如何动态衡量效率随时间的变化,并将其分解为技术效率变化与技术进步,从而精准定位效率变动的根源。通过实战步骤演示了数据准备、软件操作(如DEAP 2.1)及结果解读,并结合水资源环境效率等案例,展示了其在包含非期望产出时的应用价值,为研究者进行动态效率分析提供了清晰指南。

b0c1d2的博客 220

SpringBoot项目使用JWT+拦截器实现token验证

上述流程当中token的具体实现方式为JWT,其全称是,官网地址:https://jwt.io/就是通过JSON形式作为Web应用中的令牌,用于在各方之间安全地将信息作为JSON对象传输。在数据传输过程中还可以完成数据加密、签名等相关处理。通俗地说,JWT的本质就是一个字符串,它是将用户信息保存到一个Json字符串中,然后进行编码后得到一个JWT token,并且这个JWT token带有签名信息,接收后可以校验是否被篡改,所以可以用于在各方之间安全地将信息作为Json对象传输。

weixin_44320429的博客 1万+

halcon3d点云补全方法

属于halcon实例中的内容,后面还接了一部分的匹配

Tianwen_running的博客 1231

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

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

qq_51705526的博客 1万+

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

[ JWT ] SpringBoot 集成 JWT 实现 token 鉴权

SpringBoot 集成 JWT 实现 token 鉴权 适于前后端分离项目,token鉴权验证

爪白白的个人博客 3041

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

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

java SpringBoot登录验证token拦截器

springBoot拦截器定义,以及token获取,单点登录设定,全局异常定义。

前方的路在刚开始 9041

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

springboot jwt redis实现token刷新

使用jwt的好处就是,服务器不需要维护,存储token的状态。服务器只需要验证Token是否合法就行。确实省了不少事儿。但是弊端也显而易见,就是服务器没法主动让一个Token失效,并且给Token指定了exp过期时间后,不能修改。 配合redis,就可以轻松的解决上面两个问题 token的续约 服务器主动失效指定的token 接下来,我会演示一个实现Demo 初始化一个工程 <parent> <groupId>org.springframework.boot</group

csdn_0xFFFF的博客 3864

SpringBoot + Vue 集成 JWT 实现 Token 验证以及一种 Token 刷新策略的实现

前言 本文将介绍基于 SpringBoot 和 Vue 的前后端分离项目集成 JWT 的一种思路,此外还包括在包括记住密码功能情况下 Token 的刷新策略,本文假设你对以下知识有一定的了解,如果未接触过,建议先看一下推荐链接的内容: JWT 的基本知识:JWT入门教程 跨域问题:解决前后端分离项目跨域问题 SpringBoot 集成 redis:通过源码了解redis的自动配置 下面这张图是本文实现 Token 验证以及刷新 Token 的基本思路,本文展示了实现最终效果的核心代码,完整代码(包括前端

庄周de蝴蝶的博客 2166

Springboot+Spring-Security+JWT+Redis实现restful Api的权限管理以及token管理(超详细用爱发电版)

前言 其实挺早就想写一篇关于jwt的博文去好好总结一下之前踩过的坑了,但是事情有点太多了,一直没抽出时间来写,刚好现在有点时间可以好好静下来写一遍(可能)有点质量的博文吧,毕竟一直都是看别人的博文去学习,我也好好写一遍吧哈哈。既然如果偶然搜到这篇文章的话,我相信大家应该都了解了什么是jwt,比较想知道怎么使用springboot+spring-security去实现,当然也可以使用shiro,其...

ech13an的博客 8万+

springboot集成JWT实现token认证的示例和一些常见问题

springboot的拦截器无效的问题 springboot+jwt+token 1.扫描包的问题 导致拦截器失效的原因可能是没有扫描到配置拦截器的包 查看spring启动类的,添加@ComponentScan(basePackages = {"com.example.demo.config"})或@SpringBootApplication(scanBasePackages = {"com.example.demo.config"}) 2.springboot版本问题 springboot2版本以上不支

mrxutada的博客 925

jwt 如何防止token被拦截_SpringBoot+JWT实战(附源码)

SpringBoot集成JWT首先我们搭建好SpringBoot框架,SpringBoot环境准备就绪。接下来执行以下操作:1.引入依赖引入JWT依赖,由于是基于Java,所以需要的是java-jwt。<dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt&...

weixin_34337678的博客 1233

【SpringBoot】JWT+Token之Token自动续期

Springboot+jwt+token实现双token认证

低调做人,低调编码,神码都是浮云 2231

SpringBoot+JWT实现登陆token验证并存储用户信息

/用来跳过验证的PassToken @Target({@Data @ApiModel("返回结果") public class R < T > {/*** 错误码*/ @ApiModelProperty("错误码") private Integer code;/*** 错误消息*/ @ApiModelProperty("错误消息") private String msg;/*** 内容*/ @ApiModelProperty("内容") private T data;

Jul_C18672868641的博客 4280

亲测有效!SpringBoot项目采用JWT登录认证与保持,并解决跨域问题

在使用JWT实现认证时,需要将生成的token存储到前端,并在每次向后端发送请求时将token放入请求header中,这样后端才能识别该用户是否已登录以及是否有权限访问该接口。这段代码会在每次请求前检查localstorage中是否存在token,并将其添加到请求的header中。注意:为了避免XSS攻击,不要直接将token存储在localstorage中,可以考虑使用sessionStorage或者cookie等更加安全的存储方式。一步步跟着做就可以了。

weixin_45928161的博客 2052

如何使jwt生成的 token在用户登出之后失效?

这里做了一个设计是"将所有用户(同一用户)登录token已list的形式存在redis中",如果一个用户登出,则将该用户的token从list中删除,下次请求时会校验list中是否有该key,如果有放行,否则就要重新登录;这里要考虑用户可以多端同时登陆(即每个设备都会产生一个token),如果一个设备登出而不想影响其他设备的登录,此时就要将登出的那个token单独处理;1,加入黑名单的方式需要额外的占用存储空间,本次暂未考虑该方式;问题1:如何使jwt生成的 token在用户登出之后失效?

Gavin 3310
上一篇: Mybatis使用@Options注解批量插入记录后返回记录id
下一篇: java 开发多if else 代码优化
javaXingzhe
博客等级 码龄8年 3145粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值