json web token登录

JSON Web Token (JWT): 理解与应用 JSON Web Token (JWT) 阅读详情

1.引入jar包



2.jwt加密得到token,解密获取登录信息

package com.baosight.JWT.tool;

import java.text.ParseException;
import java.util.Map;

import net.minidev.json.JSONObject;

import com.nimbusds.jose.JOSEException;
import com.nimbusds.jose.JWSAlgorithm;
import com.nimbusds.jose.JWSHeader;
import com.nimbusds.jose.JWSObject;
import com.nimbusds.jose.JWSSigner;
import com.nimbusds.jose.Payload;
import com.nimbusds.jose.crypto.MACSigner;
import com.nimbusds.jwt.JWT;
import com.nimbusds.jwt.JWTParser;
import com.nimbusds.jwt.ReadOnlyJWTClaimsSet;
public  class AuthHelper {
	//可有无,随意设置的属性值
	static String BAOSIGHT_SHORTNAME = "test";
	//站点秘钥
	static String BAOSIGHT_SECRET = "3d990d2276917dfac04467df11fff26d";
	//加密,id </span><span style="font-size: 18px; font-family: Arial, Helvetica, sans-serif;">(用户在网站中的唯一标示),flag(是否记住密码一周)</span>
<span style="font-size:18px;"><span style="white-space:pre">	</span>public static String getToken(String id,String flag){
		JSONObject userInfo = new JSONObject();
        //网站二级域名
        userInfo.put("short_name", BAOSIGHT_SHORTNAME);//必须项
        //用户id(用户在网站中的唯一标示)
        //这里添加一个javabean对象,会出现类型异常
        userInfo.put("user_key", id);//必须项
        //flag设置到期时间
        userInfo.put("flag", flag);
        //用户名
        userInfo.put("name", "网站用户A");//可选项
        Payload payload = new Payload(userInfo);

        JWSHeader header = new JWSHeader(JWSAlgorithm.HS256);
        header.setContentType("jwt");


        // Create JWS object
        JWSObject jwsObject = new JWSObject(header, payload);

        // Create HMAC signer
        JWSSigner signer = new MACSigner(BAOSIGHT_SECRET.getBytes());

        try {
                jwsObject.sign(signer);


        } catch (JOSEException e) {

                System.err.println("Couldn't sign JWS object: " + e.getMessage());
                return "error";
        }
        // Serialise JWS object to compact format
        String token = jwsObject.serialize();
        return token;
	}

	public static String  parseToken(String token){
		 try {
				JWT t=JWTParser.parse(token);
				//获取Claims // 包括需要传递的用户信息; { "sub": "1234567890", "name": "John Doe", "admin": true }
				ReadOnlyJWTClaimsSet s=t.getJWTClaimsSet();
				Map<String, Object> map=s.getAllClaims();
//				userInfo userInfo=(com.baosight.JWT.bean.userInfo) map.get("user");
//				System.out.println(userInfo.getId()+userInfo.getFlag());
				String user_key=(String) map.get("user_key");
				String flag=(String) map.get("flag");
				System.out.println(flag);
				return user_key;
			} catch (ParseException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				return null;
			}

	}
//测试
	public static void main(String[] args) {
		String token =getToken("venbill","true");
		String user_key=parseToken(token);
		System.out.println(user_key);
//		System.out.println("id:"+u.getId()+", flag:"+u.getFlag());
	}

}</span>

3.登录:doLogin

servlet:
package com.baosight.JWT.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.baosight.JWT.tool.AuthHelper;


/**
 * Servlet implementation class doLogin
 */
public class doLogin extends HttpServlet {
	private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public doLogin() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String name=request.getParameter("name");
		String password=request.getParameter("password");
		String getFlag=request.getParameter("autoAuth");
		int durationDays=-1;
		String autoAuth="flase";
		if (getFlag!=null) {
			durationDays=7;
			autoAuth="true";
		}
		AuthHelper ah=new AuthHelper();
		String token=ah.getToken(name, autoAuth);
		System.out.println(token);</span>
<span style="font-size:18px;"><span style="white-space:pre">		</span>//存入cookie
		Cookie cookie = new Cookie("JWT-Test2", token);
		cookie.setPath("/");
		cookie.setMaxAge(durationDays*60*60*24);
		response.addCookie(cookie);
		Cookie[] cookies = request.getCookies();
        for(Cookie c :cookies ){
            System.out.println(c.getName()+"--->"+c.getValue());
        }
        response.sendRedirect("/JWT-Test2/success.jsp");
	}

}



login.html
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>welcome to baosight</title>
</head>
<body>
	<table>
	<form action="http://localhost:8888/JWT-Test2/doLogin" method="POST">
		<tr><td>用户名:     <input type="text" name="name" /><br></td></tr>
		<tr><td>密    码: <input type="text" name="password" /><br></td>
</tr>
<tr>
				<td>	<input type="checkbox" name="autoAuth" value="true" />记住一周</td>

	<td>	<input type="submit" value="Submit" /></td></tr>
	</form>
	</table>
</body>
</html>

success.html

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>login success</h1>
	<form action="http://localhost:8888/JWT-Test2/doLogout" method="POST">

			<input type="submit" value="退出" />
	</form>
</body>
</html>


4.登出doLogout

servlet:
package com.baosight.JWT.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class doLogout
 */
public class doLogout extends HttpServlet {
	private static final long serialVersionUID = 1L;

    public doLogout() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//删除cookie</span>
<span style="font-size:18px;"><span style="white-space:pre">		</span>Cookie[] cookies = request.getCookies();
		if(cookies != null)
			for(Cookie cookie : cookies) {
				if(cookie.getName().equals("JWT-Test2")) {
					System.out.println("cookname========="+cookie.getName());</span>
<span style="font-size:18px;"><span style="white-space:pre">					</span>//这里必须设置path,不然删除不了,必要时需要设置path和domain
					cookie.setMaxAge(0);
					cookie.setPath("/");
					response.addCookie(cookie);
					break;
				}
			}
		request.getRequestDispatcher("/login.html").forward(request, response);

	}

}

5.设置过滤器,每次访问页面拿取、判断token

filter:
package com.baosight.JWT.filter;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.baosight.JWT.tool.AuthHelper;


/**
 * Servlet Filter implementation class AuthorTokenFilter
 */
public class AuthorTokenFilter implements Filter {

    /**
     * Default constructor.
     */
    public AuthorTokenFilter() {
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see Filter#destroy()
	 */
	public void destroy() {
		// TODO Auto-generated method stub
	}

	/**
	 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
	 */
	public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
		HttpServletRequest request = (HttpServletRequest) req;
		HttpServletResponse response = (HttpServletResponse) resp;
		String token = null;
		Cookie[] cookies = request.getCookies();</span>
<span style="font-size:18px;"><span style="white-space:pre">		</span>//拿取cookie并判断
		if(cookies != null)
			for(Cookie cookie : cookies) {
				if(cookie.getName().equals("JWT-Test2")) {
					token=cookie.getValue();
					break;
				}
			}
		AuthHelper ah=new AuthHelper();
		try {
			String id=ah.parseToken(token);
			System.out.println(id);
			request.getRequestDispatcher("/success.jsp").forward(request, response);
		} catch (Exception e) {
			response.sendRedirect("/JWT-Test2/login.html");
		}
		chain.doFilter(request, response);
	}

	/**
	 * @see Filter#init(FilterConfig)
	 */
	public void init(FilterConfig fConfig) throws ServletException {
		// TODO Auto-generated method stub
	}

}

web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>JWT-Test2</display-name>
  <servlet>
    <description></description>
    <display-name>doLoginServlet</display-name>
    <servlet-name>doLoginServlet</servlet-name>
    <servlet-class>com.baosight.JWT.servlet.doLogin</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>doLoginServlet</servlet-name>
    <url-pattern>/doLogin</url-pattern>
  </servlet-mapping>
  //过滤器配置,访问所有jsp页面都经过该过滤器</span>
<span style="font-size:18px;">  <filter>
    <display-name>AuthorTokenFilter</display-name>
    <filter-name>AuthorTokenFilter</filter-name>
    <filter-class>com.baosight.JWT.filter.AuthorTokenFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>AuthorTokenFilter</filter-name>
    <url-pattern>*.jsp</url-pattern>
  </filter-mapping>
  <servlet>
    <description></description>
    <display-name>doLogout</display-name>
    <servlet-name>doLogout</servlet-name>
    <servlet-class>com.baosight.JWT.servlet.doLogout</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>doLogout</servlet-name>
    <url-pattern>/doLogout</url-pattern>
  </servlet-mapping>
</web-app>

6.网页打开:http://localhost:8888/JWT-Test2/login.html

登录登出测试




SpringCloudGateway+JWT统一认证鉴权 参考springcloud-learning/micro-oauth2 阅读详情

相关推荐

登录校验——JWT(JSON Web Token)介绍

JWT(JSON Web Token)是一种在Java前后端分离项目中实现登录功能的常用方式。本文将对前后端的分析,JWT在前后端的联系以及其在登录功能中的作用和优缺点进行详细介绍。

qq_59708493的博客 696

JWT基础教程

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

我有故人折剑去,斩尽春风不曾归 1011

nimbus-jose-jwt-4.41.1-API文档-中文版.zip

赠送jar包:nimbus-jose-jwt-4.41.1.jar; 赠送原API文档:nimbus-jose-jwt-4.41.1-javadoc.jar; 赠送源代码:nimbus-jose-jwt-4.41.1-sources.jar; 赠送Maven依赖信息文件:nimbus-jose-jwt-4.41.1.pom; 包含翻译后的API文档:nimbus-jose-jwt-4.41.1-javadoc-API文档-中文(简体)版.zip; Maven坐标:com.nimbusds:nimbus-jose-jwt:4.41.1; 标签:nimbusds、nimbus、jose、jwt、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

基于JWT+拦截器实现用户登录拦截

基于JWT+拦截器实现用户登录拦截 首先是maven依赖 <dependency> <groupId>com.nimbusds</groupId> <artifactId>nimbus-jose-jwt</artifactId> <version>6.0</version> </dependency> 然后是JwtUti

qq_43375881的博客 1765

Claude Code 实战指南:用 AI 玩转终端编程,效率狂飙!

本文介绍了终端 AI 代理工具 Claude Code,涵盖常用命令、使用方法(如 init 初始化、权限配置、工作流程、上下文管理)、MCP 扩展工具及实战案例,展示其通过自然语言辅助开发的高效性与实用性。

个人技术 1万+

Flink CDC 3.0 详解

Flink CDC 是基于数据库日志 CDC(Change Data Capture)技术的实时数据集成框架,支持全增量一体化、无锁读取、并行读取、表结构变更自动同步、分布式架构等高级特性。配合Flink 优秀的管道能力和丰富的上下游生态,Flink CDC 可以高效实现海量数据的实时集成。Flink CDC 于2023年12月7日重磅推出其全新的 3.0 版本,3.0版本的发布对 Flink CDC 而言具有里程碑的意义,自此 Flink CDC 从捕获数据变更的Flink 数据源正式迈向为以 Flink

奔跑的蜗牛的博客 2639

JWT –生成和验证令牌–示例

JWT提供了一种非常有趣的方式来表示可以验证和信任的应用程序之间的声明。 我的目标是展示一个小的样本,它使用出色的Nimbus JOSE + JWT库来生成和验证令牌。 总览 进行介绍的最佳地点之一是这里 。 简而言之,要从jwt.io网站的资料中借用,声明将表示为一个编码的json,分为三部分,并用点(。)分隔。 header.payload.signature 标头是json,其...

最佳 Java 编程 2268

别再只看成交量了!用通达信这个VOL监测公式,一眼识别主力吸筹与出货信号

本文详细介绍了通达信VOL监测公式的实战应用,通过彩色量柱和换手率分层技术,帮助投资者识别主力吸筹与出货信号。该公式结合动态量能标准化和多周期均线组合,提供可视化主力行为图谱,提升交易决策的准确性。

weixin_28693447的博客 662

前后端分离、或APP用户登录解决方案——JWT(json web token)生成Token详解!

JWT简介 JWT(json web token)是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准。 JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源。比如用在用户登录上。 基于session的登录认证 在传统的用户登录认证中,因为http是无状态的,所以都是采用session方式。用户登录成功,服务端会保证一个sessi...

一亩地的专栏 3922

C++ 程序稳定运行一段时间后异常中止?vc6 运行库的bug!!!

事件查看器提示:错误应用程序 xxxxxxx.exe,版本 0.0.0.0,错误模块 MSVCRTD.DLL,版本 6.0.9782.0,错误地址 0x00012b40。这是一个通信方面的软件,需要长期运行,在压力测试时,高负荷连续运行一定天数时必定崩溃,而且都是在msvcrtd.dll中崩溃。后来在dump文件中发现调用栈在是MSVCRTD.DLL模块,跟踪代码发现是在void * __cdecl _heap_alloc_dbg(        size_t nSize,        int nBloc

qingflying的专栏 2680

C#与天文观测:Celestia模拟星空的奇幻之旅

Celestia就像一艘穿梭在星海中的小飞船,带领我们遨游宇宙。C#则是这艘飞船的智能导航系统,用代码指挥它飞向任何我们向往的星球或星系。首先,下载并安装Celestia,熟悉其基本操作和功能。创建一个星空目标列表,包括不同的恒星、行星和星系。// 示例:定义观察目标列表new SpaceObject("太阳"),new SpaceObject("月球"),new SpaceObject("火星")

java专栏 1456

JWT(JSON Web Token)认证登录方案是怎么样的

JWT(JSON Web Token)认证登录方案是怎么样的?

weixin_46316088的博客 300

博途PLC S7-1200/1500 ModbusTcp通信SCL代码篇(轮询)

博途PLC MODBUS TCP的详细讲解和注意事项,可以参看下面这篇博文,这里不在赘述。这篇作为SCL代码篇主要给出SCL语言下的轮训写法和注意事项。博途PLC1200/1500PLC ModbusTcp通信(轮询处理)_RXXW_Dor的博客-优快云博客。............

RXXW_Dor的博客 8424

登录令牌JWT — JSON WEB TOKEN

登录令牌JWT — JSON WEB TOKEN 关于作者 作者介绍 ???? 博客主页:作者主页 ???? 简介:JAVA领域优质创作者????、一名在校大三学生????、在校期间参加各种省赛、国赛,斩获一系列荣誉???? ???? 关注我:关注我学习资料、文档下载统统都有,每日定时更新文章,励志做一名JAVA资深程序猿????‍???? JWT简介 1、概述 传统的Web应用中,使用session来存在用户的信息,每次用户认证通过以后,服务器需要创建一条记录 保存用户信息,通常是在内存中。

Java厂长 2392

GRSL 2026 即插即用 | Transformer篇 | DCSA:动态稀疏门控自注意力,兼顾长距离依赖与局部细节表达!

SDANet整体架构和模块Dynamic Channel Sparse Attention (DCSA):DCSA为Transformer块中的自注意力层。DCSA架构:样本级动态稀疏注意力:首次实现每个样本独立预测注意力稀疏度:通过轻量门控网络根据输入特征的复杂度自适应调整保留的通道数,简单样本使用更高稀疏度(如保留 20% 通道),复杂样本使用更低稀疏度(如保留 80% 通道),在保证精度的前提下平均计算量降低 50% 以上。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 108

规控面试常见问题

规划控制算法常见问题。

每天进步一点点。 983

八幅漫画理解使用JSON Web Token设计单点登录系统

八幅漫画理解使用JSON Web Token设计单点登录系统 9月 07, 2015inEngineering 上次在《JSON Web Token - 在Web应用间安全地传递信息》中我提到了JSON Web Token可以用来设计单点登录系统。我尝试用八幅漫画先让大家理解如何设计正常的用户认证系统,然后再延伸到单点登录系统。 如果还没有阅读《JSON W...

anyi8827的博客 242

OV9734 DATASHEET,完整规格书

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

怎样使用JSON Web Token设计单点登录系统

这期内容当中小编将会给大家带来有关八幅漫画理解使用JSON Web Token设计单点登录系统,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。 用户认证 所谓用户认证(Authentication),就是让用户登录,并且在接下来的一段时间内让用户访问网站时可以使用其账户,而不需要再次登录的机制。 小知识:可别把用户认证和用户授权(Authorization)搞混了。用户授权指的是规定并允许用户使用自己的权限,例如发布帖子、管理站点等。 首先,服务器应用(下面简称“应用”)

BTYE的博客 190

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

JSON Web Token (JWT)笔记(token实现单点登录功能)

文章目录cookie(浏览器客户端)session(web服务端)单点登录三种方式 cookie(浏览器客户端) 百度百科-cookie(安全威胁) cookie是客户端技术,存储在本地浏览器中,每次发送请求带着cookie值发送。 Cookie,有时也用其复数形式Cookies。类型为“小型文本文件”,是某些网站为了辨别用户身份,进行Session跟踪而储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息。 简介 Cookie 并不是它的原意“甜饼”的意思, 而是一

qq_43813373的博客 3689

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

JWT(Json Web Token)实现无状态登录

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

yiXin_Chen的博客 960

APP用户登录解决方案——JWT(json web token)生成Token

什么是JSON Web Token? JSON Web Token(JWT)是一个开放式标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间以JSON对象安全传输信息。这些信息可以通过数字签名进行验证和信任。可以使用秘密(使用HMAC算法)或使用RSA的公钥/私钥对对JWT进行签名。 为什么使用JWT? 随着技术的发展,分布式web应用的普及,通过session管理用户登录状态...

lgxzzz的博客 927

八幅漫画理解使用 JSON Web Token 设计单点登录系统

点击上方“芋道源码”,选择“设为星标”做积极的人,而不是积极废人!源码精品专栏原创 | Java 2019 超神之路,很肝~中文详细注释的开源项目RPC 框架 Dubbo 源码解析网络...

芋艿V 162

JSON Web Token单点登录设计

八幅漫画理解使用JSON Web Token设计单点登录系统

weixin_34324081的博客 130

Json Web Token分布式站点的单点登录场景

先了解基于token的认证和传统的session认证的区别 1、session认证 什么是cookies和session? cookies浏览器会话技术,用来存储信息sessionid session是服务器端的缓存技术 浏览器端的缓存技术,为了辨别用户身份,进行session跟踪而存储在用户本地终端上的数据。 HTTP协议 无连接和无状态的特性,是cookies和sessio...

qq_36609501的博客 608

JSON Web Token (JWT) - 八幅漫画理解使用JSON Web Token设计单点登录系统

JSON Web Token (JWT) - 八幅漫画理解使用JSON Web Token设计单点登录系统

张同光 (Tongguang Zhang):Hello everyone ! 2736
上一篇: resteasy + mybatis 项目搭建
下一篇: java.lang.NoSuchFieldException: resourceEntries
programmeryu
博客等级 码龄11年 23粉丝 67原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值