单点登录-CAS基础入门

基于CAS协议的SSO单点登录-深度剖析 阅读详情

1.什么是单点登录

单点登录(SingleSignOn,简称为SSO,是目前比较流行的企业业务整合的解决方案之一。
SSO的定义是在多个应用系统(分布式应用)中,用户只需要登录一次就可以访问所有相互信任的应用系统。

SSO含义:
在一个分布式系统中,假设有很多个子系统,那么只要在一个子系统登录成功,所有的系统就自动全部登录成功!只要在一个在子系统中退出,那么所有的系统自动退出!

我们目前的系统存在诸多子系统,而这些子系统是分别部署在不同的服务器中,那么使用传统方式的session是无法解决的,我们需要使用相关的单点登录技术来解决。
在这里插入图片描述
SSO中文单点登录,如何实现单点登录功能?

需要CAS这个开源框架来实现! SSO术语 CAS是实现单点登录的一个框架!

2.什么是CAS

SSO是单点登录名词: CAS是实现单点登录SSO的一种框架!

CAS是Yale大学发起的一个开源项目,旨在为Web应用系统提供一种可靠的单点登录方法,CAS在2004年12月正式成为JA-SIG的一个项目。CAS具有以下特点:

【1】开源的企业级单点登录解决方案。
【2】CASServer为需要独立部署的Web应用。认证服务器!
【3】CASClient支持非常多的客户端(要登录的子系统)(这里指单点登录系统中的各个Web应用),包括Java,.Net,PHP,Perl,Apache,uPortal,Ruby等。

从结构上看,CAS包含两个部分:CASServer和CASClient。CASServer需要独立部署,主要负责对用户的认证工作;CASClient负责处理对客户端受保护资源的访问请求,需要登录时,重定向到CASServer。下图是CAS最基本的协议过程:
在这里插入图片描述

SSO单点登录访问流程主要有以下步骤:

1. 访问服务:SSO客户端发送请求访问应用系统提供的服务资源。
2. 定向认证:SSO客户端会重定向用户请求到SSO服务器。
3. 用户认证:用户身份认证。
4. 发放票据:SSO服务器会产生一个随机的Service Ticket。
5. 验证票据:SSO服务器验证票据Service Ticket的合法性,验证通过后,允许客户端访问服务。
6. 传输用户信息:SSO服务器验证票据通过后,传输用户认证结果信息给客户端。

3.CAS服务端部署

Cas服务端其实就是一个war包。
cas-server-4.0.0-release\cas-server-4.0.0\modules目录下
cas-server-webapp-4.0.0.war 将其改名为cas.war放入tomcat目录下的webapps下。启动tomcat自动解压war包。浏览器输入http://localhost:8080/cas/login ,可看到登录页面
在这里插入图片描述
不要嫌弃这个页面丑,我们后期可以再提升它的颜值。暂时把注意力放在功能实现上。
这里有个固定的用户名和密码 casuser /Mellon
登录成功后会跳到登录成功的提示页面!
在这里插入图片描述
添加登陆的用户:
在这里插入图片描述
在这里插入图片描述
在此配置文件中添加用户!

4.CAS服务端配置

4.1.端口修改

如果我们不希望用8080端口访问CAS, 可以修改端口

(1)修改TOMCAT的端口

打开tomcat 目录 conf\server.xml 找到下面的配置
将端口8080,改为9999
在这里插入图片描述
(2)修改CAS配置文件
修改cas的WEB-INF/cas.properties
在这里插入图片描述

4.2.cas如何去掉HTTPS认证

CAS默认使用的是HTTPS协议,如果使用HTTPS协议需要SSL安全证书(需向特定的机构申请和购买) 。如果对安全要求不高或是在开发测试阶段,可使用HTTP协议。我们这里讲解通过修改配置,让CAS使用HTTP协议。

(1)修改cas的WEB-INF/deployerConfigContext.xml
找到下面的配置
在这里插入图片描述
这里需要增加参数p:requireSecure=“false”,requireSecure属性意思为是否需要安全验证,即HTTPS,false为不采用

(2)修改cas的/WEB-INF/spring-configuration/ticketGrantingTicketCookieGenerator.xml
找到下面配置

参数p:cookieSecure=“true”,同理为HTTPS验证相关,TRUE为采用HTTPS验证,FALSE为不采用https验证。
参数p:cookieMaxAge="-1",是COOKIE的最大生命周期,-1为无生命周期,即只在当前打开的窗口有效,关闭或重新打开其它窗口,仍会要求验证。可以根据需要修改为大于0的数字,比如3600等,意思是在3600秒内,打开任意窗口,都不需要验证。
在这里插入图片描述
(3)修改cas的WEB-INF/spring-configuration/warnCookieGenerator.xml
找到下面配置
在这里插入图片描述

5.CAS服务端数据源设置

5.1.需求分析

我们现在让用户名密码从我们的tb_user表里做验证

5.2.配置数据源

(1)修改cas服务端中web-inf下deployerConfigContext.xml ,添加如下配置
在这里插入图片描述

<!--数据源-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"  
	  p:driverClass="com.mysql.jdbc.Driver"  
	  p:jdbcUrl="jdbc:mysql://127.0.0.1:3306/easygodb?characterEncoding=utf8"  
	  p:user="root"  
	  p:password="123456" /> 
	  
  <!--密码加密处理-->  
<bean id="passwordEncoder" class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder"  
c:encodingAlgorithm="MD5"  
p:characterEncoding="UTF-8" />  
	  
<!--数据库认证 -->		  
<bean id="dbAuthHandler"  
  class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"  
  p:dataSource-ref="dataSource"  
  p:sql="select password from tb_user where username=? and del=0"  
  p:passwordEncoder-ref="passwordEncoder"/> 

然后在配置文件开始部分找到如下配置

<bean id="authenticationManager" class="org.jasig.cas.authentication.PolicyBasedAuthenticationManager">
        <constructor-arg>
            <map>               
                <entry key-ref="proxyAuthenticationHandler" value-ref="proxyPrincipalResolver" />
                <entry key-ref="primaryAuthenticationHandler" value-ref="primaryPrincipalResolver" />
            </map>
        </constructor-arg>      
        <property name="authenticationPolicy">
            <bean class="org.jasig.cas.authentication.AnyAuthenticationPolicy" />
        </property>
</bean>

其中

 <entry key-ref="primaryAuthenticationHandler" value-ref="primaryPrincipalResolver" />

一句是使用固定的用户名和密码,我们在下面可以看到这两个bean ,如果我们使用数据库认证用户名和密码,需要将这句注释掉。

添加下面这一句配置

<entry key-ref="dbAuthHandler" value-ref="primaryPrincipalResolver"/>

在这里插入图片描述
(2)将以下三个jar包放入webapps\cas\WEB-INF\lib下
在这里插入图片描述
用数据库中的用户名和密码进行测试!

6.CAS服务端界面改造

6.1.需求分析

我们现在动手将CAS默认的登录页更改为自己的登陆页

6.2.改头换面
6.2.1.拷贝资源

(1)将易购商城的登陆页login.html拷贝到cas系统下WEB-INF\view\jsp\default\ui 目录下
(2)将css js等文件夹拷贝到 cas目录下
(3) 将原来的casLoginView.jsp 改名(可以为之后的修改操作做参照),将login.html改名为casLoginView.jsp

6.2.2.修改页面

编辑casLoginView.jsp内容
(1)添加指令

<%@ page pageEncoding="UTF-8" %>
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

(2)修改form标签

<form:form method="post" id="fm1" commandName="${commandName}" htmlEscape="true" class="sui-form">
......
</form:form>

(3)修改用户名框

<form:input id="username" tabindex="1" 
                    accesskey="${userNameAccessKey}" path="username" autocomplete="off" htmlEscape="true" 
                    placeholder="邮箱/用户名/手机号" class="l_user" />   

(4)修改密码框

 <form:password  id="password" tabindex="2" path="password" 
                    accesskey="${passwordAccessKey}" htmlEscape="true" autocomplete="off" 
                    placeholder="请输入密码" class="l_pwd"   />

(5)修改登陆按钮

<input type="hidden" name="lt" value="${loginTicket}" />
<input type="hidden" name="execution" value="${flowExecutionKey}" />
<input type="hidden" name="_eventId" value="submit" />
<input class="XXXX" accesskey="l" value="登陆" type="submit" />
6.2.3.错误提示

在表单内加入错误提示框

<form:errors path="*" id="msg" cssClass="errors" element="div" htmlEscape="false" />

测试:输入错误的用户名和密码,提示是英文。这个提示信息是在WEB-INF\classes目录下的messages.properties文件中

authenticationFailure.AccountNotFoundException=Invalid credentials.
authenticationFailure.FailedLoginException=Invalid credentials.

设置国际化为zh_CN ,修改cas-servlet.xml
在这里插入图片描述

<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver" p:defaultLocale="zh_CN" />

在这里插入图片描述
我们需要将此信息拷贝到messages_zh_CN.properties下,并改为中文提示(转码)

authenticationFailure.AccountNotFoundException=\u7528\u6237\u4E0D\u5B58\u5728.
authenticationFailure.FailedLoginException=\u5BC6\u7801\u9519\u8BEF.

第一个是用户名不存在时的错误提示
第二个是密码错误的提示

多系统使用CAS实现SSO登录案例 实现SSO有很多种方案,比较简单且可行的一般都是如上两种再加上CAS,一般企业内部多个系统之间如果想实现SSO,比较推荐的方式就是今天要介绍的CAS,Central Authentication Service,中央身份认证服务。CAS Server,作为认证服务的中心,需要单独部署;CAS Client,指需要单点登录的各个系统,官方支持10+类型的客户端;如下是一个多系统完整进行CAS SSO的流程:SSO登录流程。 阅读详情

相关推荐

CAS 实现单点登录(SSO)基本实现流程(一)

单点登录(Single Sign On),简称为SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。   CAS (Central Authentication Service),中央认证服务。CAS(Central Authentication Service)是一款不错的针对 Web 应用的单点登录框架

何静媛 2万+

SSO及CAS浅谈

       单点登录SSO(Single Sign On)。抛开前人成果,细细想来无非存储信任,验证信任,作用范围和安全性。粗略想想采用cookie或者单独的管理系统应该都能实现,貌似也不是很遥远的东西,但是真正做好还有很远的路。一、SSO的两种架构集中验证:各系统登录交由专门的信任验证服务器完成登录动作,统一了用户账户密码,但是一旦验证服务器宕机SSO功能将全部丧失;多点验证:登录动作由各个系...

那些回忆里 1万+

CAS单点登录从入门到部署

当我们访问其他的应用,与前面的步骤也是基本相同,首先用户访问受保护的资源,跳转回浏览器,浏览器含有先前登录的CASTGC cookie,CASTGC cookie包含了TGT并发送到CAS认证中心,CAS认证中心校验TGT是否有效,如果有效分发浏览器一个带ST参数的资源地址URL,应用程序拿到ST后,再发送给CAS认证中心,如果认证了ST有效后,结果会返回一个包含成功信息的XML给应用。用户凭借ST去访问service,service拿ST去CAS验证,验证通过后,允许用户访问资源。PGT是ST签发的。

cgk_ALEM的博客 1998

单点登录SSO与CAS

什么是单点登录? 单点登录的英文名叫做:Single Sign On(简称SSO)。 在以前的时候,一般就是单系统,所有的功能都在同一个系统上。 后来,我们为了合理利用资源和降低耦合性,于是把单系统拆分成多个子系统。 回顾:分布式基础知识 比如阿里系的淘宝和天猫,很明显这是两个系统,但是你在使用的时候,登录了天猫,淘宝也会自动登录。 简单来说,单点登录就是在多个系统中,用户只需一次登录,各个系统即...

weixin_43869318的博客 738

CAS方式实现单点登录

单点登录,英文是 Single Sign On,缩写为 SSO。 多个站点(192.168.1.20X)共用一台认证授权服务器(192.168.1.110,用户数据库和认证授权模块共用)。用户经由其中任何一个站点(比如 192.168.1.201)登录后,可以免登录访问其他所有站点。而且,各站点间可以通过该登录状态直接交互。 CAS Server 为需要独立部署的 Web 应用。CAS Client 支持非常多的客户端(这里指单点登录系统中的各个 Web 应用),包括 Jav...

monologuezjp的博客 1万+

Jmeter之压测CAS单点登录

现在公司项目很多都使用cas单点登录,那么在使用Jmeter做压测时,需要对录制的脚本进行一些相关配置,下面内容是我看了各方资料,最后成功跑通了,记录一下,在这里记录分享给大家。

嘘!别说话! 2172

CAS单点登录

tomcat开发环境配置启用https SSO之CAS单点登录详细搭建教程 CAS单点登录-简介(一)  - 优快云博客 CAS单点登录-基础搭建HelloWorld(二)  - 优快云博客 CAS单点登录-配置中心(三)  - 优快云博客 CAS单点登录-https配置(四)  - 优快云博客 CAS单点登录-自定义认证之JDBC(五)  - 优快云博客 CAS单点登录-...

xueyunzi1的博客 373

CAS——实现单点登录

正常单点登录的效果是:用户只需要登录一次就可以访问所有相互信任的应用系统,也就是这两个应用,当第一个登录成功之后,登录第二个应用可以不用输入CAS端验证的用户名和密码了,直接跳转到系统内。 在一切都配置好了之后本以为会实现单点登录的效果,可是对于CAS,事与愿违的事情总是太多。在Application1登录成功之后,Application2并没有直接跳转,而是需要重新登录的。在宏杰大牛的帮助下终于实现了。修改了CAS客户端的配置。过程是酱紫的:

许小乖……是总攻 4910

单点登录参考

http://www.docin.com/p-5227988.html?docfrom=rrela 单点登录技术文档 http://www.docin.com/p-1430853047.html?_t_t_t=0.16638332161534652 单点登录技术现状 http://www.cnblogs.com/ywlaker/p/6113927.html 单点登录入门 http://w...

weixin_30706691的博客 128

CAS单点登录系统实现指南

本文还有配套的精品资源,点击获取 简介:CAS是一个Java语言开发的开源SSO框架,用于在多个系统间实现用户单次登录。该框架通过中心认证服务器,使得用户在授权的多个应用系统之间仅需登录一次。本文将详细介绍CAS单点登录的工作原理、实现步骤,并展示如何通过部署结构完成系统配置。 1. CAS简介与单点登录概念 1.1 CAS的定义及重要性 中央认证服务...

weixin_34064233的博客 1951

Android System Slice应用加载分析,及启用Slice后,锁屏日期第一次开机正常显示,但后面锁屏不显示问题分析

最近发现Android P上锁屏界面,日期不显示,发现从P开始后,出现了Slice来允许应用以模块化,可交互的方式,插入多个使用场景。Android P的system UI 也使用到了这一特性,表现为锁屏时间,日期,勿扰图标,闹钟等。 如何使用Slice 以System UI中KeyguardSliceView.java来说明它的使用方法 首先,我们打开System UI 的mk 文件,可以看到以...

qq_33595823的博客 3036

三、SpringBoot集成CAS 单点登录,CAS Client。CAS 单点登录动态开关。

目录CAS 简介二级目录三级目录 CAS 简介 1、CAS 单点登录分为两个部分,第一个是认证中心 Cas Server,第二个是 Cas Server。 我们使用 SpringBoot 集成 Cas 只需要集成Client。 2、CAS API官方文档 3、cas 简介博客 二级目录 三级目录 ......

uziuzi669的博客 1万+

Vivado ILA调试全攻略:从HDL实例化到Block Design的5个实战技巧

本文全面解析了Vivado集成逻辑分析仪(ILA)的五种核心调试方法,涵盖从HDL代码实例化到Block Design集成的实战技巧。详细对比了不同方法的优缺点与适用场景,并重点介绍了如何利用Debug Hub高效管理多时钟域复杂调试,旨在帮助FPGA开发者精准定位问题,显著提升板级调试效率。

weixin_29214199的博客 378

CAS单点登录原理

之前我们谈了如何关于单点登录的一些概述,讲到了当跨域名单点登录时,CAS的设计具有参考价值,那么这篇就该谈谈CAS的具体原理了。 CAS单点登录 CAS指的是Apereo的CAS开源项目,三个字母分别是是Central Authentication Service的首字母缩写。 官方地址: 网址:https://www.apereo.org/projects/cas git:https:...

not_easy的专栏 4121

Hypermesh二次开发实战:Tcl命令分类与常用函数详解(附避坑指南)

本文深入解析Hypermesh二次开发中Tcl命令的三大核心类别:界面命令、查询命令与修改命令。重点剖析了*createmark集合管理与hm_getvalue信息查询等关键函数的实战用法,并提供了避免Mark覆盖、生命周期管理等常见陷阱的实用指南,旨在帮助CAE工程师构建高效可靠的自动化前处理流程。

weixin_29233333的博客 242

Spatio-Temporal Graph Convolutional Networks: A Deep Learning Framework for Traffic Forecasting 论文笔记

Spatio-Temporal Graph Convolutional Networks: A Deep Learning Framework for Traffic Forecasting 论文笔记-----GCN在交通领域的应用(二) 一、论文翻译: 1、摘要: 及时准确地交通预测对于城市交通控制和指导具有至关重要的意义。由于交通流量的非线性和复杂性,传统的方法不能满足中长期预测任务的需求,并且往往会忽略时空数据的时间和空间依赖特性。在这篇论文中,为了处理在交通领域的时间序列预测问题...

cy_believ的博客 1916

CAS实现单点登录

1.简介 SSO单点登录 在多个相互信任的系统中,用户只需要登录一次就可以访问其他受信任的系统。 新浪微博与新浪博客是相互信任的应用系统。 *当用户首次访问新浪微博时,新浪微博识别到用户未登录,将请求重定向到认证中心,认证中心也识别到用户未登录,则将请求重定向到登录页。 *当用户已登录新浪微博访问新浪博客时,新浪博客识别到用户未登录,将请求重定向到认证中心,认...

heyeqingquan的博客 1万+

5G核心网NAS消息解析:从协议字段到实际抓包分析(附Wireshark示例)

本文深入解析5G核心网NAS消息的实战分析方法,从协议字段解读到实际Wireshark抓包诊断。通过详解扩展协议鉴别器、安全头类型、流程事务标识等核心字段,并结合注册流程故障排查实例,指导工程师快速定位NAS层问题,提升5G网络调试与协议分析效率。

grass的博客 532

面试题—CAS单点登录

目录1.什么是单点登录?2.什么是CAS?3.CAS框架结构4. CAS中3个术语5.cas处理流程 1.什么是单点登录? 单点登录:Single Sign On,简称SSO,SSO使得在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。 2.什么是CAS? CAS框架:CAS(Central Authentication Service,即:统一认证服务)是实现SSO单点登录的...

java coding girl 2965

别再只会复制Haar级联代码了!OpenCV人脸检测全方案深度解析,从原理到工业级落地

通用预训练模型在你的业务场景效果不好时,用自己的业务数据集训练专属的级联器,是提升精度的终极方案,OpenCV自带和工具,支持自定义Haar/LBP级联器训练。场景首选方案次选方案新手入门学习Haar级联分类器LBP级联分类器嵌入式轻量固定场景LBP级联分类器YuNet轻量版工业级落地项目(99%场景)DNN+YuNetMTCNN多人脸+小目标复杂场景DNN+YuNet自定义微调模型同时做人脸+其他目标检测。

2601_94871597的博客 380

【SpringBoot笔记44】SpringBoot多数据源配置(方式一:配置多个mapper扫描不同的包路径实现多数据源配置)

在SpringBoot应用开发中,一般情况下,都是只会配置一个数据源信息,之后整个工程都是对当前数据源进行增删改查的操作。但是,在实际开发里面,也有可能会遇到多数据源的情况,例如:当前工程中除了需要访问自己应用的数据库,还需要直接连接第三方系统的数据库进行业务处理,这种情况下,就需要进行多数据源的配置。SpringBoot考虑到了这一点,所以它是支持多数据源的配置的,下面介绍一下如何配置多数据源。

✅ Java 开发工程师 1118

基于CAS实现单点登录

CAS 一、概述 CAS是中央认证服务Central Authentication Service的简称。最初由耶鲁大学的Shawn Bayern 开发,后由Jasig社区维护,经过十多年发展,目前已成为影响最大、广泛使用的、基于Java实现的、开源SSO解决方案。 2012年,Jasig和另一个有影响的组织Sakai Foundation合并,组成Apereo。Apereo是一个由高等学术教育机...

高興 7163

Unity3D实现视频和模型融合效果

在Unity中,视频和3D模型融合通常涉及到将视频表面内嵌到3D场景中。视频不影响模型的展示, 这可以通过使用Shader和Texture来实现。大家好,我是心疼你的一切,不定时更新Unity开发技巧,觉得有用记得一键三连哦。下面就让我们进入正文吧!提示:以下是本篇文章正文内容,下面案例可供参考本次介绍的就是视频和模型融合的实现,以后有其他的需要添加的会继续添加不定时更新Unity开发技巧,觉得有用记得一键三连哦。么么哒。

心疼你的一切博客 5357

松哥手把手教你入门 Spring Boot + CAS 单点登录

松哥周末抽空给 Spring Security 系列也录制了一套视频,目录如下: 感兴趣的小伙伴戳这里–>Spring Boot+Vue+微人事视频教程 我们来看今天的 CAS 单点登录。 在微服务以及分布式系统中,单点登录变得越来越普遍,松哥之前也有两篇文章和大家介绍过单点登录的方案: OAuth2+JWT 方案 @EnableOAuth2Sso 注解方案 这两种方案中,JWT 存在一个注销登录的问题,要费点功夫解决。@EnableOAuth2Sso 注解这种方案不存在注销登录的问题,但是又不

江南一点雨的专栏 7693

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

【cas基础】SSO基于cas实现单点登录

概念介绍 1.定义 CAS ( CentralAuthentication Service ) 是 Yale 大学发起的一个企业级的、开源的项目,旨在为 Web 应用系统提供一种可靠的单点登录解决方法(属于 WebSSO )。   2.结构体系   从结构体系看, CAS 包括两部分: CAS Server 和 CAS Client 。 CAS Server 负责完成对用户的认证

IT Girl 5357

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

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

上一篇: Nginx专题(八)- Nginx配置高可用的集群
下一篇: 单点登录-SpringBoot整合CAS
熊猫IT技术
熊猫IT技术 优质创作者: Java技术领域 优质创作者: Java技术领域 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄10年 6021粉丝 1312原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

熊猫IT技术

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值