使用spring安全容器管理web程序

Spring框架核心模块 对数据访问的支持、与不同数据源的集成和事务管理的功能,提供了对JDBC、ORM(Hibernate、MyBatis)、NoSQL(如Redis、MongoDB)、JMS等的支持。提供了对应用程序安全保护的功能,包括认证(Authentication)和授权(Authorization),支持基于角色的访问控制和其他安全功能。提供了对单元测试和集成测试的支持,包括对JUnit、TestNG等测试框架的集成以及对Spring应用程序的自动化测试的功能。 阅读详情

说明.ssh的不贴了 只有spring安全容器的 其他的不贴(目标 实现简单的管理)

spring的容器好处微笑:解决session伪造 跳跃访问 页面必须参数 方法权限等等

 数据库  :基本的 用户表-资源表-角色表及相互之间的关联表

 

web.xml

   <!-- spring的监听 -->
  <listener>
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
 
   <filter> 
        <filter-name>springSecurityFilterChain</filter-name> 
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
    </filter> 
    <filter-mapping> 
        <filter-name>springSecurityFilterChain</filter-name> 
        <url-pattern>/*</url-pattern> 
    </filter-mapping> 

applicationContext.xml

 

<?xml version="1.0" encoding="UTF-8"?>
<beans
 xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:p="http://www.springframework.org/schema/p"
 xmlns:security="http://www.springframework.org/schema/security"
 xsi:schemaLocation="http://www.springframework.org/schema/beans
 http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
  http://www.springframework.org/schema/security
    http://www.springframework.org/schema/security/spring-security-3.1.xsd
 ">
 
   <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
   <property name="driverClass" value="com.microsoft.sqlserver.jdbc.SQLServerDriver">
   </property>
   <property name="jdbcUrl" value="jdbc:sqlserver://localhost:1433;databaseName=mydb">
   </property>
   <property name="user" value="sa"></property>
   <property name="password" value="123456"></property>
    </bean>
 

<!--不用添加到安全容器中去-->
  <security:http pattern="/**/*.css" security="none"/>
  <security:http pattern="/login.jsp*" security="none"/>
  <security:http pattern="/admin/login.jsp*" security="none"/>
    
  <security:http  access-decision-manager-ref="myaccessDecisionManager">
       <!-- 没用但是重要 否者不会执行我们自定义的myaccessDecisionManager-->
       <security:intercept-url pattern="/**" access="ROLE_XXX" />
        <!-- session失效去的页面,  -->
        <security:session-management invalid-session-url="/login.jsp"></security:session-management>
        <!-- 登录页面为/login.jsp,登录成功页面为/index.jsp,且总是用这个页面为登录成功页面 -->
        <security:form-login login-page="/login.jsp" authentication-failure-url="/login.jsp" default-target-url="/index.jsp"  always-use-default-target="true"  />
 </security:http>
  <bean id="myaccessDecisionManager" class="com.spring.MyAccessDecisionManager">
     <property name="dataSource" ref="dataSource"></property>
  </bean>
 
 <security:authentication-manager>
        <security:authentication-provider> 
        <!-- 查询用户和对应的权限。。 -->
        <security:jdbc-user-service data-source-ref="dataSource" 
        users-by-username-query="select u.username,u.password,u.status as enabled from users u where u.username=? " 
         authorities-by-username-query="select u.username, r.name as authority from dbo.user_role ur join dbo.users u
         on u.id=ur.user_id join dbo.roles r on r.id=ur.role_id where u.username = ? "  cache-ref="userCache"/>
      </security:authentication-provider>
 </security:authentication-manager>
 <!--用户的缓存-->
 <bean id="userCache" class="org.springframework.security.core.userdetails.cache.EhCacheBasedUserCache">
       <property name="cache" ref="userEhCache"></property>
  </bean>   
  <bean id="userEhCache" class="org.springframework.cache.ehcache.EhCacheFactoryBean">
      <property name="cacheManager" ref="cacheManager"></property>
      <property name="cacheName" value="userCache"></property>
  </bean>
  <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"></bean>
    
 
  <!-- 消息提示 -->
  <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <property name="basename" value="classpath:org/springframework/security/messages_zh_CN" />
    </bean>
 

</beans>

上面的可以添加更多的东西  请参考官方的文档

 

自己定义的MyAccessDecisionManager类

package com.spring;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

import org.apache.log4j.Logger;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.security.access.AccessDecisionManager;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.security.access.AuthorizationServiceException;
import org.springframework.security.access.ConfigAttribute;
import org.springframework.security.access.SecurityConfig;
import org.springframework.security.authentication.InsufficientAuthenticationException;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class MyAccessDecisionManager  implements AccessDecisionManager{

 private  Logger logger = Logger.getLogger(MyAccessDecisionManager.class);
 
 private ComboPooledDataSource  dataSource; 
 public ComboPooledDataSource getDataSource() {
  return dataSource;
 }
 public void setDataSource(ComboPooledDataSource dataSource) {
  this.dataSource = dataSource;
 }
  
 @Override
 public void decide(Authentication authentication, Object object,
   Collection<ConfigAttribute> configAttributes) throws AccessDeniedException,
   InsufficientAuthenticationException {
  

//请求的url
  logger.info("当前请求:"+object.toString() ); 
   Object obj = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
   UserDetails userDetails = null;
   List<String> list_role= null;
   //没有当前用户  --》跳跃访问
   try {
    userDetails =(UserDetails)obj;
  } catch (Exception e) {
    throw new AuthorizationServiceException("认证失败!");
  }
   Connection con =null;
   PreparedStatement ps  = null;
   ResultSet set  = null;
   try {
   con= dataSource.getConnection();
    String sql = "select rl.name from resc_role rr join rescs re on rr.resc_id = re.id  join roles rl on rr.role_id = rl.id where re.res_string = ? ";
   //数据库查询对应的
    ps=  con.prepareStatement(sql);
    System.out.println( "|"+ object.toString().substring( object.toString().indexOf("/")  )+"|" );
    ps.setString(1 ,  object.toString().substring( object.toString().indexOf("/")  )  );
    set =  ps.executeQuery(); 
    list_role = new ArrayList<String>();
    while(set.next()){   
     list_role.add(set.getString("name") );
    }
  } catch (Exception e) {
   // TODO: handle exception
   e.printStackTrace();
  }finally{
  
    try {
     if(set!=null)set.close();
    } catch (SQLException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
    try {
     if(set!=null) ps.close();
    } catch (SQLException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
    try {
     if(set!=null) con.close();
    } catch (SQLException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    } 
  } 
  
  for (String string : list_role) {
   //当前用户角色
   for( GrantedAuthority g : userDetails.getAuthorities()){
     if( g.getAuthority() .equals(string) ){
      logger.info("您有权限!");
      return;
     }
    }
  }
     throw new AccessDeniedException("呵呵!没有权限!");  
 }

 @Override
 public boolean supports(ConfigAttribute arg0) {
  // TODO Auto-generated method stub
  return true;//fan hui true
 }

 @Override
 public boolean supports(Class<?> arg0) {
  // TODO Auto-generated method stub
  return true;//fanhui false
 }

 
}
类说明: 其实可以使用hibernate的缓存解决查询问题 该类可以拿到请求的路径和当前用户相互判断 如果没有抛出没权限的异常 自己看来很多的文档觉得这个简单官方也推荐 最好不要改源码

bug:我个人没搞出来的就是使用两个登录的页面登录 现实中的肯定有的 我配置两个登录页面错误之后都跳到同一个页面 如果你解决了联系哦 

 

参考

spring 3.1安全容器官方文档

 

 

SpringBoot面试题6:Spring Boot 2.X 有什么新特性?与 1.X 有什么区别? Spring Boot 2.X相对于1.X版本引入了许多新特性和改进,包括响应式编程、新的Web容器、重新设计的Actuator端点、配置属性的调整、安全性改进以及监控和管理的改进。这些改进使得开发人员能够更好地构建现代化的Spring应用程序,并提供更好的性能、安全性和可管理性。 阅读详情

相关推荐

Spring系统的安全管理

Spring安全机制 : Spring Security的验证过程:    Spring Security完成验证工作的主要类是AuthenticationManager,即上面介绍的过滤器<authentication-manager alias="authenticationManager"/>。这个过程从AuthenticationProcessingFilter拦截HTTP请求开始,接着,会从HTTP请求中得到用户输入的用户名和密码,并将这些输入的用户信息放到Authentication对象中,然后将这个Authentication对象传递给AuthenticationManager使用,让验证器完成用户验证功能的具体实现。在验证器的实现中,验证器会通过特有的Authentication对象,把它和服务器端取得的用户信息UserDetails对象进行对比, 从而最终完成用户验证。最后将通过验证的、有效的用户信息封装在一个Authentication对象中,供以后的授权器使用。

SpringBoot-安全管理框架Spring Security使用详解(1)-基本用法

一般项目都会有严格的认证和授权操作,而在Java开发领域常见的安全框架有Shiro和Spring Security。本文首先介绍下后者。 一、基本用法 1,什么是 Spring Security ? Spring Security是一个相对复杂的安全管理框架,功能比Shiro更加强大,权限控制细粒度更高,对OAuth 2的支持也更友好。 由于Spring Security源自Spring家族,因此可以和Spring框架无缝整合,特别是Spring Boot中提供的...

Andy's Blog 768

实战案例:用多智能体系统模拟房地产市场的架构设计

房地产市场是典型的复杂自适应系统:买方纠结“要不要上车”、卖方盘算“挂多少钱能快速成交”、中介忙着“撮合两边赚佣金”、政府琢磨“怎么调政策稳房价”——每一个参与者的微小决策,最终都会汇聚成“房价暴涨”“成交冰点”这样的宏观现象。传统的计量经济学模型(比如线性回归)假设“所有人都是理性人”,但现实中没人能算清所有变量——你可能因为“同事买了学区房”就跟风,也可能因为“怕失业”而放弃买房。这时候,多智能体系统(MAS)

移动开发前沿的博客 1122

Spring安全权限管理(Spring Security)

1.Spring Security简要介绍Spring Security以前叫做acegi,是后来才成为Spring的一个子项目,也是目前最为流行的一个安全权限管理框架,它与Spring紧密结合在一起。Spring Security关注的重点是在企业应用安全层为您提供服务,你将发现业务问题领域存在着各式各样的需求。银行系统跟电子商务应用就有很大的不同。电子商务系统与企业销售自动化工具又有很

阿布客栈 4万+

【牛股启动线】副图指标使用技术说明,图文案例分享,通达信炒股指标

如上图,在紫色线在黑色虚线上时,在出现紫色柱线时,通常会出现强势拉升的行情​。柱线加长加上紫色线上扬,进场跟随做多抓强势行情,紫色柱线和紫色线同时做多持续则可以继续持股。如上图,副图指标【牛股启动线】,指标信号包括紫色线走势信号和紫色柱线信号,以及底部的四条虚线技术信号​,还有一条绿色的参考线,一条黑色的虚线两天分档线。如上图,参考买点,紫色柱线开始出现时进场买点,在上图标记的位置对应的就是进场买点​。紫色柱线加长+紫色线上扬,多头共振持股,行情继续拉升阶段,持股待涨或顺势​进场做多。

weixin_69760830的博客 1906

SHAP图全解析:从理论到实践,教你如何读懂和优化模型特征

本文全面解析SHAP图,从博弈论基础到实战应用,指导读者如何解读和利用SHAP值优化机器学习模型。通过详解特征重要性条形图、小提琴图、依赖图及决策图等关键可视化工具,帮助数据科学家精准诊断模型、识别特征交互,并将洞见转化为特征工程与模型调试的实际行动,有效提升模型可解释性与性能。

svm4gardener的博客 187

SpringBoot 整合 SpringSecurity 实现安全管理

文章目录什么是 Spring Security?Spring Security 的基本配置基本用法创建项目,添加依赖创建 Controller启动项目测试配置用户名和密码基于内存的认证解决 java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null"创建 PasswordEncode...

Woo_home的博客 2180

单路径微分相除和微分自乘相减算法(PGC-SDD-DSM)

PGC-SDD-DSM算法通过融合单路微分相除和差分自乘,解决了传统PGC解调技术对调制深度和光强干扰敏感的问题,显著提升了解调稳定性和抗失真能力。其高信噪比、低谐波失真以及对参数变化的鲁棒性,使其在光纤传感领域具有重要应用价值。PGC-SDD-DSM算法在计算复杂度方面具有显著的优势,主要体现在其高稳定性和低谐波失真上。这些优势使其在光纤光学干涉传感器中表现出色,尤其是在面对光强干扰和调制深度变化时。

百态·数智思维 | 聚焦大数据、量化与未来AI 839

聊一聊 Spring 中的线程安全性

Spring与线程安全 Spring作为一个IOC/DI容器,帮助我们管理了许许多多的“bean”。但其实,Spring并没有保证这些对象的线程安全,需要由开发者自己编写解决线程安全问题的代码。 Spring对每个bean提供了一个scope属性来表示该bean的作用域。它是bean的生命周期。例如,一个scope为singleton的bean,在第一次被注入时,会创建为一个单例对象,该对象会...

Coding Road 547

YOLOv8模型RKNN量化策略与RK3588部署实战解析

本文详细解析了YOLOv8模型在RK3588平台上的RKNN量化策略与部署实践。通过对比INT8和FP16量化方式的性能差异,结合实际测试数据,为开发者提供了从模型导出、转换到板端部署的完整解决方案,帮助实现高效的边缘AI应用部署。

oil88的博客 1078

S7-1200PLC期末复习题(第七章)

A.0 B.1 C.4 D.-4 A、CV = 0 B、CV = 1 C、CV < 4 D、CV >= 4A、0,0 B、3,0 C、1,1 D、3,1 A、0 B、1 C、先是1,再变为0 D、先是0,再变为1置位输出:常开触点M0.0闭合,Q0.0变为1状态并保存该状态,即使M0.0断开,Q0.0也保持1状态。 复位输出:常开触点M0.1闭合时,Q0.0变为0状态并保持该状态,即使M0.1断开,Q0.0也保持为0状态。 A、1 B、0 C、5 D、10RESET_BF指令需要两个参数,第一个是复位的位数

qq_52251819的博客 4413

spring实战学习(1)————什么是Spring?

什么是Spring 1.spirng核心就是容器,Spring 和完整的相关库产品组合还提供 Web 框架、各种数据持久性选项、安全框架与其他系统的集成、运行时监视、微服务支持、响应式编程模型以及许多其他功能,应用于现代应用程序开发。 容器是什么? 在spring中,程序生命周期不是由组件自身创建和决定的,是由容器,也就是spring应用程序上下文决定的。关系如下 组件注入的方式是根据xml或者java注解 xml方式如下: <bean id = "inventoryServeice" class

lzkyeyeye的博客 196

适航文章汇总:知识体系全面梳理

无论您是行业新手还是经验丰富的专业人士,都可以通过本篇文章快速查找相关资料,提高对适航认证、机载系统、软件及硬件等领域的理解。本部分详细解析ARP 4754A、ARP 4761、DO-178C、DO-254等核心标准,并介绍其在机载系统开发中的应用。介绍FAA、EASA、CCAR等主要航空管理机构的适航规章体系,并说明各类飞行器(如固定翼、旋翼机、无人机等)的适航要求。本部分还探讨硬件设计、验证与确认过程中的挑战。从系统架构设计到机载设备的集成与管理,本部分介绍机载系统的研发体系及适航管理的最佳实践。

qq_41854911的博客 1448

Spring介绍

Spring是一个开源的Java应用程序开发框架,它提供了一个综合的编程和配置模型,用于构建现代化的企业级应用程序。

逐梦苍穹的博客 2605

基于激光雷达与视觉融合的四旋翼无人机室内避障方法研究

本文研究了一种基于激光雷达与视觉融合的四旋翼无人机室内避障方法。针对单一传感器在室内环境中的局限性,提出通过激光雷达提供精确几何距离、视觉相机补充语义信息的融合方案。研究内容包括:搭建ROS硬件平台集成单目相机与2D激光雷达;设计基于扩展卡尔曼滤波的传感器融合模型;改进VFH算法结合视觉深度图进行路径规划。实验验证表明,该方法在复杂室内环境下具有较高的鲁棒性、实时性与避障成功率,为解决无GPS信号环境下的无人机自主导航问题提供了有效方案。

huanghm88的专栏 347

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

servlet和tomcat

​ Servlet是Java Web应用程序中的一个组件,它可以接收HTTP请求并返回HTTP响应,通常用于处理Web应用程序中的动态请求。Servlet运行在Web容器中,Web容器负责管理Servlet的生命周期、处理Servlet的请求和响应等任务。​ Tomcat是一个流行的Java Web容器,它是一个开源项目,由Apache软件基金会管理和维护。

weixin_52236586的博客 233

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

初识Spring

开始java项目开发,刚从.net来到java,突然觉得自己好像失去了很多东西,一脸懵,不过慢慢的开始适应了, 今天就带大家来一起了解一下java中的一个框架spring 认识spring Spring框架是一个java应用最广的轻量级的框架,他的理念主要包括:IOC(控制反转)与AOP(面向切面编程) 标题Spring是什么: Spring是一个轻量级IOC/DI和AOP容器的开源框架 AOP:...

Aran 345

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Spring

Basics Central to the Spring Framework is its IoC container, which provides a consistent means of configuring and managing Java objects using reflection.  The container can be turned into a partially...

魏勇的专栏 165

Spring框架的概念、优势、核心功能

(6)Spring Security:Spring框架提供了一个安全框架,称为Spring Security,用于保护Web应用程序中的资源和数据,提供了一套安全认证和授权机制,可以保证应用程序的安全性和稳定性。总的来说,Spring框架是一个非常强大的Java应用程序框架,它提供了一系列的工具和技术,用于简化Java应用程序的开发,并且具有很好的可扩展性和可维护性,可以帮助开发人员更加高效地开发出高质量的应用程序。维护的Web应用程序。

lonely_baby的博客 820

spring常见面试题

1、什么是Spring框架?Spring框架有哪些主要模块? Spring框架是一个为Java应用程序的开发提供了综合、广泛的基础性支持的Java平台。 Spring帮助开发者解决了开发中基础性的问题,使得开发人员可以专注于应用程序的开发。 Spring框架本身亦是按照设计模式精心打造,这使得我们可以在开发环境中安心的集成Spring框架,不必担心Spring是如何在后台进行工作的。 Spring框架至今已集成了20多个模块。这些模块主要被分如下图所示的核心容器、数据访问/集成,、Web、AOP(面向切面编

shangshanzixu的博客 179

(二) Spring之面试题29问

1、什么是Spring 框架?Spring 框架有哪些主要模块? Spring 框架是一个为Java 应用程序的开发提供了综合、广泛的基础性支持的Java 平台。 Spring 帮助开发者解决了开发中基础性的问题,使得开发人员可以专注于应用程序的开发。 Spring 框架本身亦是按照设计模式精心打造,这使得我们可以在开发环境中安心的集成 Spring 框架,不必担心 Spring 是如何在后台进行工作的。 Spring 框架至今已集成了20 多个模块。这些模块主要被分如下图所示的核心容器、数据访问/集成,、

w_x_A__l__l的博客 458

1-Spring概述

1.1.1  Spring是什么 Spring是一个开源的轻量级Java SE(Java 标准版本)/Java EE(Java 企业版本)开发应用框架,其目的是用于简化企业级应用程序开发。应用程序是由一组相互协作的对象组成。而在传统应用程序开发中,一个完整的应用是由一组相互协作的对象组成。所以开发一个应用除了要开发业务逻辑之外,最多的是关注如何使这些对象协作来完成所需功能,而且要低耦合、高内聚。...

小波的博客 273

spring框架实现实例化和依赖注入的方式分别是什么_Spring面试底层原理的那些问题,你真的懂Spring吗?...

1、什么是 Spring 框架?Spring 框架有哪些主要模块?Spring 框架是一个为 Java 应用程序的开发提供了综合、广泛的基础性支持的 Java 平台。Spring帮助开发者解决了开发中基础性的问题,使得开发人员可以专注于应用程序的开发。Spring 框架本身亦是按照设计模式精心打造,这使得我们可以在开发环境中安心的集成 Spring 框架,不必担心 Spring 是如何在后台进行工...

weixin_39571087的博客 151

Spring Bean的作用域了解

在上述中我们先使用 @Component 注解表明是一个 springbean 项目,而后通过 @singleton 注解将其作用域设置为了 singleton.这意味着我们 spring 将只创建一个 bean 实例,并将其缓存下来.当我们获取这个 bean 实例时 spring 会直接获取缓存中的实例,而不会在创建一个新的,这样避免了重复的创建,提高了性能和效率.request场景:需要为每个请求创建一个新的 Bean 实例的场景, 需要在每次请求中使用不同的配置或数据,可以使用request作用域.

weixin_63176822的博客 235

Spring框架概述

除此之外,Spring还提供了许多其他的模块,如Spring Web、Spring Security、Spring Batch等,使得开发者可以更方便地实现Web应用、安全管理、批处理等功能。Spring框架是一个轻量级的Java应用程序开发框架,旨在提高Java应用程序的开发效率和质量。它提供了一种基于依赖注入和面向切面编程的方式来管理Java组件之间的关系和交互。总之,Spring框架通过提供一系列的组件和模块,使得开发者可以更快速、更高效地开发Java应用程序。

lonely_baby的博客 235

servlet容器,web容器,spring容器,springmvc容器,dubbo容器之间区别

文章目录1 各个容器1.1 Web容器1.2 Servlet容器1.3 Servlet容器和ServletContext的关系1.4 Spring容器和SpringMVC容器1.5 spring与springmvc容器区别1.6 dubbo容器与spring,springmvc容器区别2 容器间的关系图 1 各个容器 1.1 Web容器 web容器(web服务器)主要有:Apache、IIS、To...

上善若泪 5134
下一篇: cglib动态代理模式
java_lilin
博客等级 码龄14年 364粉丝 124原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值