获取authorization_刚教完面试官OAuth 2.0为什么要先获取授权码code

Spring Authorization Server:实现OAuth2认证服务 Spring Authorization Server是一个安全框架,它提供了OAuth 2.1和OpenID Connect 1.0规范以及其他相关的实现。Spring Authorization Server是在Spring Security的基础上构建的,它为构建OAuth2授权服务和OpenID Connect 1.0身份提供者提供了一个安全、轻量级、可定制的基础。OAuth2协议定义了一系列关于认证授权的标准,允许用户授权第三方应用访问他们存储在另外的服务提供者上的信息。 阅读详情

xx软件最终是通过访问令牌请求到我的公众号里的文章。访问令牌是通过授权码换来的。你有想过为何要用授权码换令牌,而不直接颁发访问令牌呢?

OAuth 2.0 的角色

资源拥有者、客户端(即第三方软件)、授权服务和受保护资源。

  • 资源拥有者=> 我
  • 客户端 => xx软件
  • 授权服务 -> 公众号开放平台的授权服务
  • 受保护资源 -> 我的公众号里的文章

03dce7f3d1050f1acfaff1b5acde4dc1.png

一定要授权码吗?

第 4 步授权服务生成授权码,倘若我们不要授权码,这步直接返回访问令牌access_token 。那就不能重定向,因为这样会把安全保密性要求极高的访问令牌暴露在浏览器,增加访问令牌失窃风险。这显然不行的呀!即若无授权码,就只能把访问令牌发给第三方软件的后端服务:

651ac01e0996f393aa1c9736902ba513.png

看着好像没问题?我访问xx软件,xx软件说要排版文章我得给它授权,不然vx公众号不干,然后xx软件就引导我跳转到了公众号的授权服务。到授权服务之后,开放平台验证xx的合法性及我的登录状态后,生成授权页面。我赶紧扫码同意授权,于是开放平台知道可以把我的文章数据给xx软件。

于是,开放平台生成访问令牌 access_token,并且通过后端服务方式返回给xx软件。xx就能正常工作。

但是当我被浏览器重定向到授权服务,我和xx间的连接就断了,相当于此时我和授权服务建立连接后,将一直“停留在授权服务页面”。我再也没有重连到xx。

但这时xx已拿到我授权后的访问令牌,也使用访问令牌获取了我的号里的文章数据。这时,考虑我的感受。xx应该要通知到我,但是如何做呢?现在连接可是断了的呀! 为了让xx通知到我,我必须跟xx重建 “连接”。即第二次重定向,我授权后,又重新重定向回到xx的地址,这样我就跟xx有了新连接。

为重建连接,又不能暴露访问令牌,就有这样的临时、间接凭证:授权码。因为xx最终要拿到高安全要求的访问令牌,并非授权码,授权码可以暴露在浏览器。 有了授权码,访问令牌可以在后端服务间传输,同时还可重建我&xx间的连接。 所以,通过授权码,既考虑了我的用户体验,又考虑了通信安全。

执行授权码流程时,授权码和访问令牌在xx和授权服务间到底怎么流转的?

授权码许可类型的通信过程

间接通信

间接通信就是指获取授权码的交互。

1ff04a3771cb7ff8830607229b04b057.png

我:“xx,我要访问你了。” xx:“我把你引到授权服务,我需要授权服务给我一个授权码。” 授权服务:“xx,我把授权码发给浏览器了。” 小兔软件:“ 那我从浏览器拿到了授权码。”

xx和授权服务间,并无直接通信,而是通过中间人(浏览器).

直接通信

授权码换取访问令牌的交互,是“直接”的。

7ce534a17c971bc62a6c35b692276d68.png

三方软件xx获取到授权码后,向授权服务发起获取访问令牌 access_token 的请求。

三方软件要代表资源拥有者去访问受保护资源 授权服务负责颁发访问令牌,受保护资源负责接收并验证访问令牌。

开发微信小程序场景

比如获取用户登录态信息的过程:

  • 通过 wx.login(Object object) 获取登录凭证 code,该步是在小程序内部通过调用微信提供的 SDK 实现的
  • 再通过该 code 换取用户的 session_key 等信息,即官方文档的 auth.code2Session 方法,同时该方法也是被强烈建议通过开发者的后端服务来调用

参考

  • https://leokongwq.github.io/2017/02/28/why-oauth2-use-authorization-code.html
  • https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/login/auth.code2Session.html
  • https://segmentfault.com/q/1010000014642301
  • https://tools.ietf.org/html/rfc6749
oauth2.0授权码模式详解 Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 oauth2.0授权码模式 欢迎关注博主公众号「Java大师」, 专注于分享Java领域干货文章http://www.javaman.cn/sb2/oauth-code 授权码(authorization code)方式,指的是第三方应用先申请一个授权码,然后再用该码获取 阅读详情

相关推荐

通过springboot框架,自己动手实现oauth2.0授权码模式认证

前言 随着几大社交平台霸主地位的确立,各个小型网站越来越倾向于通过平台认证来简化申请和登录帐号的流程,以增加用户量。这种授权认证方式一般和oauth2.0协议脱不了关系。因为我是在接入qq登录时第一次看到这个标准,所以参考qq登录的官方模版来实现这一过程。(我之前已经写过一篇接入qq登录的博客:网站实现qq登录(springboot后台)) 什么是oauth2.0 阅读理解OAut...

七和 5675

OAuth 2.0实战-为什么要先获取授权码code?

xx软件最终是通过访问令牌请求到我的公众号里的文章。访问令牌是通过授权码换来的。你有想过为何要用授权码换令牌,而不直接颁发访问令牌呢? OAuth 2.0 的角色 资源拥有者、客户端(即第三方软件)、授权服务和受保护资源。 资源拥有者=> 我 客户端 => xx软件 授权服务 -> 公众号开放平台的授权服务 受保护资源 -> 我的公众号里的文章 第 4 步授权服务生成授权码,倘若我们不要授权码,这步直接返回访问令牌access_token 。那就不能重定向,因为这样会把安全保密

JavaEdge全是干货的技术号 10万+

SpringBoot攻略十五、spring security oauth2服务端(authorization_code授权码模式)

上一篇:【SpringBoot攻略十四、spring security oauth2服务端(client_credentials客户端模式)】 基于【SpringBoot攻略十三、spring security oauth2服务端(password密码模式)】 做如下修改: 1、WebSecurityConfig 添加 @Override protected void configure(Ht...

java爱分享 1266

OAuth2授权码模式

OAuth2授权码模式 授权码授权的工作流程图: 前端发送到第三方登录请求 资源服务器拿到请求后进行重定向并把client_id带上,重定向到第三方授权服务器 然后在第三方授权服务器拿到请求后进行验证,验证账号密码是否正确 再然后从前端页面重定向到资源服务器进行登录账号 登录成功后资源服务器拿到code,再然后资源服务器把带有code、client_id、client_secret的信息重定向发送到第三方授权服务器,向它索要Token 授权服务器把角色信息和头像图片封装到Token里面,然后颁发封装好的

mengxin_chen的博客 3337

【项目实战】基于OAuth2.0认证的Code模式接口集成身份平台IAM,实现单点登录SSO功能

【项目实战】基于OAuth2.0认证的Code模式接口集成身份平台IAM,实现单点登录SSO功能。

奶爸的编程之路,也就一周冷个三天 2546

若依框架集成saToken

若依版本3.8.8,鉴权采用security框架,这种框架太重,项目中想实现对外提供接口功能。尽快减少修改原框架的逻辑基础上,采用satoken实现。

sccd2009的专栏 1482

OAuth2.o的授权码模式为什么要用code获取token?

OAuth2.0 zhua难题持续更新。

Authing的博客 2524

ZYNQ裸机双网口通信实战:手把手教你用SDK和LWIP配置PS+PL以太网(附完整源码)

本文详细介绍了在ZYNQ裸机环境下实现双网口通信的全流程,包括硬件配置、LWIP协议栈优化及TCP通信实现。通过Vivado SDK和LWIP协议栈,开发者可以高效配置PS端内置网口与PL端扩展网口,提升嵌入式网络应用的灵活性和性能。附完整源码,助力快速开发。

weixin_30831529的博客 420

为什么OAuth2里面在获取access token之前一定要先获取code,然后再用code去获取access token

为什么OAuth2里面在获取access token之前一定要先获取code,然后再用code去获取access token 为什么OAuth2里面在获取access token之前一定要先获取code,然后再用code去获取access token oauth2在获取access_token之前,一定要先获取code,主要是因为安全原因: code需要设置过期时间,一般设置的过期时间非常短,如10分钟等,用户需要在短时间内通过code换取access_token,避免code被第三方拦截。当然,即便这种情

qq_25123887的博客 2773

直流无刷BLDC六步换相“电流环”、“速度环”的关系

4、在电流闭环模式下,电机的电流严格按给定电流运行,负载大小变化时,电流不变,电机速度跟随负载非正常变化,例如速度严重“超速”时,需要“限速”保护,这个任务是“速度环”的,这时“速度环”会根据设定的速度上限,控制触发器,将电机速度迅速将下来,电流降下来,在“限速”保护期间,“电流环”失去对触发器的控制作用;3、在电流闭环模式下,电机的电流严格按给定电流运行,负载大小变化时,电流不变,电机速度跟随负载正常变化,“速度环”对速度大小的控制作用是没有的;6、很多人想当然,“电流环”不工作,电机“电流”哪里来的?

u011878611的博客 5468

Mplus—验证性因素分析(Confirmatory Factor Analysis, CFA)

介绍一阶和二阶验证性因素分析概况及在Mplus中的操作方法。

m0_54401011的博客 1万+

Spring Authorization Server OAuth 2.0获取授权码流程

Spring Authorization Server OAuth 2.0获取授权码流程

m13012606980的专栏 6322

String+CytoScape构建PPI网络

1.下载CytoScape Cytoscape是一款专业强大好用的物生信息分析软件,主要达用于专业的研究人员使用,软件主要适用于整合模块化网络和生物科学联系网络图的绘制,支持多种文件格式,导入后就可以直接进行编辑或者分析等操作了,除此之外,软件还提供了强大的编辑工具,支持添加相应的注释信息,软件基于java环境组件打造。 下载地址:https://cytoscape.org/ 因为软件基于java...

xiaobai1_1的博客 1万+

实现OAuth2.0服务端【授权码模式(Authorization Code)】

要实现OAuth服务端,就得先理解客户端的调用流程,服务提供商实现可能也有些区别,实现OAuth服务端的方式很多,具体可能看http://oauth.net/code/ 各语言的实现有(我使用了Apache Oltu): Java Apache OltuSpring Security for OAuthApis Authorization Server (v2-3

u014386474的博客 4万+

终端以太网接入Internet实验

实验过程: 1.布局 2.连接 3.配置Route0和Route1 4.配置RIP 5.static: 6.查看Route0,Route1的路由表: 7.完成PC2和server0 IP地址,子网掩码和默认网关地址的配置: 8.命令行: 9.启动PC0桌面下的PPPoe宽带连接程序: 10.启动PC1桌面下的PPPoe宽带连接程序: 11.验证PC0和PC2的ICMP报文传输过程 12.验证PC1和server0的ICMP报文传输过程 关键命令说明

chaojidagouzi的博客 4082

【WorkBuddy专栏15】灵感被折叠到「更多」里,真的不重要了吗?——一个「被低估」功能的当下价值与未来演变

【WorkBuddy专栏15】灵感被折叠到「更多」里,真的不重要了吗?——一个「被低估」功能的当下价值与未来演变

AI人人懂 959

方方格子授权码_OAuth2入门(三)——Authorization Code授权模式

1.前言前面的文章讲到,oauth支持四种授权模式:简化模式(implicit)授权码模式(authorization code)密码模式(resource owner password credentials)客户端模式(client credentials)扩展模式(Extension)这篇来讲讲authorization code授权模式2.流程用户使用oauth简化模式进行第三方...

weixin_39619270的博客 8048

[HBM] RAM Cell Self Repair | 内存单元自我修复

对抗错误的大都是冗余,内存颗粒在设计的时候也考虑增加冗余。具体的说:添加冗余或备用的存储单元行和列,及时将测试中的故障进行修复和替换,存储器修复包括行修复,列修复或两者的组合。

串起点滴 783

Oauth2--- 授权码模式(authorization_code)过程

一、获取授权码Code: 访问授权服务器 /oauth/authorize 端点:(只用于"implicit", "authorization_code") GET: http://127.0.0.1:8080/oauth/authorize?client_id=client&response_type=code&redirect_uri=http://www.baidu...

silmeweed的博客 9107

OV9734 DATASHEET,完整规格书

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

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

(三)OAuth 2.0 授权码模式 (Authorization Code)

前言 在文章 OAuth 2.0 概念及授权流程梳理 中我们谈到OAuth 2.0的概念与流程,这里我准备分别记一记这几种授权模式的demo,一方面为自己的最近的学习做个总结,另一方面做下知识输出,如果文中有错误的地方,请评论指正,在此不胜感激。 阅读本文,默认读者已经过Spring Security有一定的了解,对OAuth2.0流程有一定了解。 带领读者对Spring Security OAuth2.0框架的授权码模式有一个比较直观的概念,能使用框架搭建授权码模式授权服务器与资源服务器(前后端分离版本)

大佬味的小男孩的博客https://www.yuque.com/dalaoweidexiaonanhai 2426

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

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

手把手OAuth2授权码模式(Authorization Code)

手把手入门OAuth2授权码模式(Authorization Code) 1.简单介绍 OAuth2 授权码模式模式基本上是用用户凭证获取token 后来获取资源的访问权限。其交互步骤如下图: 交互过程如下: 用户在客户端程序上操作某些功能希望从资源服务器获取数据 客户端程序重定向浏览器请求到授权服务器要求授权,在重定向之前客户端程序会给授权服务器传递一个参数作为回调地址 授权服务器请求用户同意,这个步骤一般需要用户先登录,如果已经登录则可能弹出一个交互页面请求用户同意授权 用户决定同意授权 授权服务器

xuejianxinokok的专栏 7400

深度学习工具包 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")

Spring Oauth2-Authorization-Server-授权码授权

Spring Oauth2-Authorization-Server 授权码方式(Authorization_Code) 基于 spring-security-oauth2-authorization-server 0.2.3 授权码方式(Authorization_Code) 分两步: 根据client_id获取code 根据code 获取 access_token 配置 client 信息 @Bean public RegisteredClientRepository jdbcRegisteredC

面朝大海,春暖花开 3473

OAuth2最经典的Authorization Code模式

在于允许用户在不告知第三方自己的帐号密码情况下,通过授权方式,让第三方服务可以获取自己的资源信息。 详细的协议介绍,开发者可以参考RFC 6749。 下面简单说明OAuth2中最经典的Authorization Code模式,流程如下: 流程图中,包含四个角色。 ResourceOwner为资源所有者,即为用户 User-Agent为浏览器 AuthorizationServer为认证服务器,可...

santer_x的博客 2788

Oauth2.0 授权访问之 授权码模式(authorization_code)访问

第一步, 申请授权码 第二步, 请求连接,获取code http://localhost:8080/oauth/authorize? response_type=code &client_id=pair &redirect_uri=ht...

chiqiejie8745的博客 1558
上一篇: http 长连接和短连接介绍
下一篇: 雪花算法的原理和实现Java
ArtisticProgramming
博客等级 码龄8年 1粉丝 6原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值