【Spring Security】打造安全无忧的Web应用--入门篇
🥳🥳Welcome Huihui's Code World ! !🥳🥳
接下来看看由辉辉所写的关于Spring Security的相关操作吧
目录
🥳🥳Welcome Huihui's Code World ! !🥳🥳
一.Spring Security是什么
1.概念
2.工作原理
二.为什么要用Spring Security
三.Spring Security怎么使用
0.创建项目
1.导入依赖
2.yml配置
3.获取security默认密码
4.Web安全配置类
5.controller
6.总体说明
①配置多用户角色访问
②配置相关页面及请求路径
③配置自定义登录
④配置安全退出
⑤配置自定义异常处理器
四.Spring Security中的常用方法
HttpSecurity介绍
一.Spring Security是什么
1.概念
`Spring Security`是一个基于`Spring`框架的安全性框架,可用于对Java应用程序进行身份验证、授权和其他安全性功能的添加。它不仅可以对Web应用程序进行保护,还可以保护非Web环境下的应用程序,如远程服务和命令行应用程序等。`Spring Security`提供了一系列可插拔的安全性特性,如基于标记的身份验证、权限控制、单点登录、密码加密等。它还支持多种安全性协议和标准,如`OAuth`、`SAML`、`OpenID`等,可与各种身份提供商集成。
2.工作原理
权限框架一般包含两大核心模块:认证(Authentication)和鉴权(Authorization)。
认证:认证模块负责验证用户身份的合法性,生成认证令牌,并保存到服务端会话中(如TLS)。
鉴权:鉴权模块负责从服务端会话内获取用户身份信息,与访问的资源进行权限比对。
核心组件介绍:
AuthenticationManager
:管理身份验证,可以从多种身份验证方案中选择一种。
Authentication
:用于验证用户的身份。
SecurityContextHolder
:用于管理SecurityContext
的ThreadLocal
,以便在整个请求上下文中进行访问,方便用户访问。
AccessDecisionManager
:负责对访问受保护的资源的请求进行决策(即决定是否允许用户访问资源)
AccessDecisionVoter
:是AccessDecisionManager的实现组件之一,它用于对用户请求的访问受保护的资源所需要的角色或权限进行投票。
ConfigAttribute
:用于表示受保护资源或URL需要的访问权限,它可以理解为是访问控制策略的一部分
二.为什么要用Spring Security
SpringBoot 没有发布之前,Shiro 应用更加广泛,因为 Shiro 是一个强大且易用的 Java 安全框架,能够非常清晰的处理身份验证、授权、管理会话以及密码加密。利用其易于理解的API,可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。但是 Shiro 只是一个框架而已,其中的内容需要自己的去构建,前后是自己的,中间是Shiro帮我们去搭建和配置好的。
SpringBoot
发布后,随着其快速发展,Spring Security
(前身叫做Acegi Security
) 重新进入人们的视野。SpringBoot
解决了Spring Security
各种复杂的配置,Spring Security
在我们进行用户认证以及授予权限的时候,通过各种各样的拦截器来控制权限的访问,从而实现安全,也就是说Spring Security
除了不能脱离Spring
,Shiro
的功能它都有。
在用户认证方面,
Spring Security
框架支持主流的认证方式,包括 HTTP 基本认证、HTTP 表单验证、HTTP 摘要认证、OpenID
和LDAP
等。在用户授权方面,
Spring Security
提供了基于角色的访问控制和访问控制列表(Access Control List,ACL
),可以对应用中的领域对象进行细粒度的控制。
Shiro
在这个环境下实际已经不具备优势了。因为Spring这个生态链现在是太强大了。总之就是,我们使用这个框架是用来帮助我们提高系统的安全性能的,假设我们没用这个框架来做安全认证,那么我们就需要手动编写很多的代码去完成权限的功能
三.Spring Security怎么使用
0.创建项目
这里依赖可以先选这三个,后面再pom中也可以自行添加(free marker等)
1.导入依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId> </dependency><!-- freemarker --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-freemarker</artifactId> </dependency> <!-- web --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- lombok --> <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional> </dependency> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope> </dependency>
spring-boot-starter-security
包含了以下几个主要的依赖:
spring-security-core:
Spring Security
的核心模块,提供了基于权限的访问控制以及其他安全相关功能。spring-security-config:提供了
Spring Security
的配置实现,例如通过Java配置创建安全策略和配置Token存储等。spring-security-web:提供了
Spring Security Web
的基本功能,例如Servlet
集成和通过HttpSecurity
配置应用程序安全策略。2.yml配置
spring:freemarker:# 设置freemarker模板后缀suffix: .ftl# 设置freemarker模板前缀template-loader-path: classpath:/templates/enabled: true server:port: 8080
3.获取security默认密码
也可以自己在yml中先配置密码(因为今天使用模拟代码,没有连接数据库)
自己设置初始的默认的密码
spring:security:user:name: 自定义用户名password: 自定义密码
4.Web安全配置类
package com.wh.security.config;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.provisioning.InMemoryUserDetailsManager; import org.springframework.security.web.SecurityFilterChain;@Configuration @EnableWebSecurity public class WebSecurityConfig {@Beanpublic PasswordEncoder bcryptPasswordEncoder() {return new BCryptPasswordEncoder();}@Beanpublic UserDetailsService userDetailsService() {//设置账户--admin--以及这个账户的角色UserDetails admin = User.withUsername("admin").password(bcryptPasswordEncoder().encode("1234")).roles("ADMIN", "USER").build();//设置账户--user--以及这个账户的角色UserDetails user = User.withUsername("user").password(bcryptPasswordEncoder().encode("1234")).roles("USER").build();return new InMemoryUserDetailsManager(admin, user);}@Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {//配置需要处理的urlhttp.authorizeRequests()//antMatchers指可以配置多个url permitAll使用这个方法代表其中的url都不需要进行认证.antMatchers("/toLogin").permitAll()//antMatchers指可以配置多个url hasRolel使用这个方法代表其中的url需要是这个角色才可以访问.antMatchers("/admin/**").hasRole("ADMIN")//antMatchers指可以配置多个url hasAnyRole使用这个方法代表其中的url只有指定了的那些角色才能访问.antMatchers("/user/**").hasAnyRole("ADMIN", "USER")//匹配任意`url`,其他的都需要认证.anyRequest().authenticated()//and表示后面继续追加条件.and()//**登录formLogin**的相关设置.formLogin()//登录进入的界面.loginPage("/toLogin")//设置登录请求的 URL,即表单提交的 URL.loginProcessingUrl("/userLogin").successForwardUrl("/successLogin")//登录所需要传递的参数.usernameParameter("username").passwordParameter("password")//and表示后面继续追加条件.and()//退出登录的相关配置.logout()//退出登录的url地址.logoutUrl("/logout")//成功退出登录之后进入的界面.logoutSuccessUrl("/");http.csrf().disable();//处理异常的界面(没有权限的时候所看到的界面)http.exceptionHandling().accessDeniedPage("/noAccess");return http.build();}}
5.controller
package com.wh.security.controller;import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping;@Controller public class UserController {@RequestMapping("/successLogin")public String successLogin() {return "default";}@RequestMapping("/toLogin")public String toLogin() {return "login";}@RequestMapping("/userLogin")public String userLogin(String username, String password) {System.out.println("username=" + username + ",password=" + password);return "default";}@RequestMapping("/admin/toAddUser")public String toAddUser() {return "admin/addUser";}@RequestMapping("/admin/toListUser")public String toListUser() {return "admin/listUser";}@RequestMapping("/admin/toResetPwd")public String toResetPwd() {return "admin/resetPwd";}@RequestMapping("/admin/toUpdateUser")public String toUpdateUser() {return "admin/updateUser";}@RequestMapping("/user/toUpdatePwd")public String toUpdatePwd() {return "user/updatePwd";}@RequestMapping("/noAccess")public String noAccess() {return "accessDenied";}}
6.总体说明
在我们没有使用web安全配置类之前,主要登录进去了,便可以访问所有的界面,但是当我们在安全配置类中配置了多用户角色访问之后,就只可以使用其中配置的用户(类比于数据库中的用户)进行登录了,我们还需要在其中配置相关页面及请求路径(登录的界面,登录的表单提交界面路径,登录成功之后进入的界面路径...),以及配置很重要的自定义异常处理器,配置了之后,当用户是没有权限去访问此页面时,就不会是纯粹的报错403等信息了,而是一个我们自定义的提示界面
①配置多用户角色访问
@Beanpublic UserDetailsService userDetailsService() {//设置账户--admin--以及这个账户的角色UserDetails admin = User.withUsername("admin").password(bcryptPasswordEncoder().encode("1234")).roles("ADMIN", "USER").build();//设置账户--user--以及这个账户的角色UserDetails user = User.withUsername("user").password(bcryptPasswordEncoder().encode("1234")).roles("USER").build();return new InMemoryUserDetailsManager(admin, user);}
接下来的操作都需要在创建的SecurityConfig配置类中完成(规范)
②配置相关页面及请求路径
其中有不需要进行认证的页面,比如说登录,那么我们就可以在其中进行配置。还有一些界面是需要特定的身份才可以访问的界面
//配置需要处理的urlhttp.authorizeRequests()//antMatchers指可以配置多个url permitAll使用这个方法代表其中的url都不需要进行认证.antMatchers("/toLogin").permitAll()//antMatchers指可以配置多个url hasRolel使用这个方法代表其中的url需要是这个角色才可以访问.antMatchers("/admin/**").hasRole("ADMIN")//antMatchers指可以配置多个url hasAnyRole使用这个方法代表其中的url只有指定了的那些角色才能访问.antMatchers("/user/**").hasAnyRole("ADMIN", "USER")//匹配任意`url`,其他的都需要认证.anyRequest().authenticated()
③配置自定义登录
.and()//**登录formLogin**的相关设置.formLogin()//登录进入的界面.loginPage("/toLogin")//设置登录请求的 URL,即表单提交的 URL.loginProcessingUrl("/userLogin").successForwardUrl("/successLogin")//登录所需要传递的参数.usernameParameter("username").passwordParameter("password")
默认的登录界面
④配置安全退出
//and表示后面继续追加条件.and()//退出登录的相关配置.logout()//退出登录的url地址.logoutUrl("/logout")//成功退出登录之后进入的界面.logoutSuccessUrl("/");
⑤配置自定义异常处理器
//处理异常的界面(没有权限的时候所看到的界面)http.exceptionHandling().accessDeniedPage("/noAccess");
四.Spring Security中的常用方法
HttpSecurity介绍
HttpSecurity
是Spring Security
的一个核心类,用于配置应用程序的安全策略。
HttpSecurity
类通常包含许多方法,可以用于配置以下内容:
HTTP 请求的安全策略,例如访问控制、跨站点请求伪造 (CSRF) 防护等。
HTTP 验证的安全策略,例如基于表单、HTTP 基本身份验证、OAuth 等。
访问受保护资源时所需的身份验证和授权方式。
方法 说明 authorizeRequests()
用于配置如何处理请求的授权,默认情况下所有的请求都需要进行认证和授权才能访问受保护的资源 formLogin()
用于配置基于表单的身份验证,包括自定义登录页面、登录请求路径、用户名和密码的参数名称、登录成功和失败的跳转等。 httpBasic()
用于配置基于 HTTP Basic
身份验证,包括定义使用的用户名和密码、realm
名称等。logout()
用于配置退出登录功能,包括定义退出登录请求的URL、注销成功后的跳转URL、清除会话、删除 Remember-Me
令牌等。csrf()
用于配置跨站请求伪造保护,包括定义 CSRF Token
的名称、保存方式、忽略某些请求等。sessionManagement()
用于配置会话管理,包括定义并发控制、会话失效、禁用URL重定向、会话固定保护等。 rememberMe()
用于配置 Remember-Me
功能,包括定义Remember-Me
令牌的名称、有效期、加密方法、登录成功后的处理方式等。exceptionHandling()
用于配置自定义的异常处理,包括定义异常处理器和异常处理页面等。 headers()
用于配置HTTP响应头信息,包括定义 X-Content-Type-Options、X-XSS-Protection、Strict-Transport-Security
等头信息。cors()
用于配置跨域资源共享,包括定义可访问的来源、 Headers
等。addFilter()
用于向当前 HttpSecurity
中添加自定义的Filter
。and()
用于在配置中添加另一个安全规则,并将两个规则合并。 匹配规则:
URL匹配
方法 说明 requestMatchers()
配置一个 request Mather
数组,参数为RequestMatcher
对象,其match
规则自定义,需要的时候放在最前面,对需要匹配的的规则进行自定义与过滤authorizeRequests()
URL权限配置 antMatchers()
配置一个 request Mather
的string
数组,参数为ant
路径格式, 直接匹配url
anyRequest()
匹配任意 url
,无参 ,最好放在最后面
保护URL
方法 说明 authenticated()
保护 Url
,需要用户登录permitAll()
指定URL无需保护,一般应用与静态资源文件 hasRole(String role)
限制单个角色访问 hasAnyRole(String… roles)
允许多个角色访问 access(String attribute)
该方法使用 SPEL
, 所以可以创建复杂的限制hasIpAddress(String ipaddressExpression)
限制 IP
地址或子网
登录formLogin
方法 说明 loginPage()
设置登录页面的 URL defaultSuccessUrl()
设置登录成功后的默认跳转页面 failuerHandler()
登录失败之后的处理器 successHandler()
登录成功之后的处理器 failuerUrl()
登录失败之后系统转向的 url
,默认是this.loginPage + “?error”
loginProcessingUrl()
设置登录请求的 URL,即表单提交的 URL usernameParameter()
设置登录表单中用户名字段的参数名,默认为 username
passwordParameter()
设置登录表单中密码字段的参数名,默认为 password
登出logout
方法 说明 logoutUrl()
登出 url
, 默认是/logout
llogoutSuccessUrl()
登出成功后跳转的 url
默认是/login?logout
logoutSuccessHandler()
登出成功处理器,设置后会把 logoutSuccessUrl
置为null
好啦,今天的分享就到这了,希望能够帮到你呢!😊😊
相关文章:

【Spring Security】打造安全无忧的Web应用--入门篇
🥳🥳Welcome Huihuis Code World ! !🥳🥳 接下来看看由辉辉所写的关于Spring Security的相关操作吧 目录 🥳🥳Welcome Huihuis Code World ! !🥳🥳 一.Spring Security是什么 1.概…...

【每日一题】【12.20】2828.判别首字母缩略词
🔥博客主页: A_SHOWY🎥系列专栏:力扣刷题总结录 数据结构 云计算 数字图像处理 力扣每日一题_ 1.题目链接 2828. 判别首字母缩略词https://leetcode.cn/problems/check-if-a-string-is-an-acronym-of-words/ 2.题目描述 今天…...

LabVIEW开发振动数据分析系统
LabVIEW开发振动数据分析系统 自动测试系统基于LabVIEW平台设计,采用了多种高级硬件设备。系统的硬件组成包括PCB振动加速度传感器,这是一种集成了传统压电加速度传感器和电荷放大器的先进设备,能够直接与采集仪器连接。此外,系统…...

去掉乘法运算的加法移位神经网络架构
[CVPR 2020] AdderNet: Do We Really Need Multiplications in Deep Learning? 代码:https://github.com/huawei-noah/AdderNet/tree/master 核心贡献 用filter与input feature之间的L1-范数距离作为“卷积层”的输出为了提升模型性能,提出全精度梯度…...

【TB作品】51单片机,具有报时报温功能的电子钟
2.具有报时报温功能的电子钟 一、功能要求: 1.显示室温。 2.具有实时时间显示。 3.具有实时年月日显示和校对功能。 4.具有整点语音播报时间和温度功能。 5.定闹功能,闹钟音乐可选。 6.操作简单、界面友好。 二、设计建议: 1.单片机自选(C51、STM32或其他单片机)。 2.时钟日历芯…...

了解C++工作机制
基于hello.cpp对C的运行进行一个初步认识,并介绍国外C大佬Cherno常用的项目结构和调试Tips C是如何工作的 C工作流程1.实用工程(project)结构(1)Microsoft Visual Studio2022新建项目后,自动生成的原始文件…...

力扣题目学习笔记(OC + Swift) 14. 最长公共前缀
14. 最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 “”。 方法一 竖向扫描法 个人感觉纵向扫描方式比较直观,符合人类理解方式,从前往后遍历所有字符串的每一列,比较相同列上的…...

WinSW设置应用程序开机启动
前言 由于使用windows自动的自启方法,不管是将程序启动服务放到开机自启文件夹中,还是创建任务计划程序,都没有很好的实现程序的开机自启效果,而WinSW很好的解决了这个问题。 下载 WinSW下载地址 注意:不同版本&#…...

Leetcode—96.不同的二叉搜索树【中等】
2023每日刷题(六十四) Leetcode—96.不同的二叉搜索树 算法思想 实现代码 class Solution { public:int numTrees(int n) {vector<int> G(n 1, 0);G[0] 1;G[1] 1;for(int i 2; i < n; i) {for(int j 1; j < i; j) {G[i] G[j - 1] * …...
正则表达式零宽断言
正则表达式零宽断言 工具类,正则表达式匹配文本内容正则表达式语法例子例子01零宽断言?< 不包含左边值? 不包含右边值例子 常用正则表达式校验数字的表达式校验字符的表达式 工具类,正则表达式匹配文本内容 /*** 正则表达式工具类*/ public class…...
uni-app学习记录
uni-app注意点记录 跳转到 tabBar 页面只能使用 switchTab 跳转路由API的目标页面必须是在pages.json里注册的vue页面。如果想打开web url,在App平台可以使用 plus.runtime.openURL或web-view组件;H5平台使用 window.open;小程序平台使用web…...

API资源对象StorageClass;Ceph存储;搭建Ceph集群;k8s使用ceph
API资源对象StorageClass;Ceph存储;搭建Ceph集群;k8s使用ceph API资源对象StorageClass SC的主要作用在于,自动创建PV,从而实现PVC按需自动绑定PV。 下面我们通过创建一个基于NFS的SC来演示SC的作用。 要想使用NFS的SC,还需要安装一个NFS…...

Databend 开源周报第 124 期
Databend 是一款现代云数仓。专为弹性和高效设计,为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务:https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展,遇到更贴近你心意的 Databend 。 新增对 Delta 和…...

Arduino开发实例-液体流量测量
液体流量测量 文章目录 液体流量测量1、流量传感器介绍2、硬件准备及接线3、代码实现在本文中,将介绍如何流量传感器进行测量液体流量。 流量传感器用于测量液体流速。 市场上有不同类型的流量传感器,在本文中,我们将使用霍尔效应流量传感器。 这些类型的流量传感器是非侵入…...

【idea】解决sprintboot项目创建遇到的问题
目录 一、报错Plugin ‘org.springframework.boot:spring-boot-maven-plugin:‘ not found 二、报错java: 错误: 无效的源发行版:17 三、java: 无法访问org.springframework.web.bind.annotation.CrossOrigin 四、整合mybatis的时候,报java.lang.Ill…...
ADC芯片CS1237在电子秤方案的优势
随着科技的不断发展,电子秤已经成为我们日常生活中不可或缺的测量工具。为了满足用户对于高精度、高稳定性的需求,芯海ADC芯片CS1237应运而生,为电子秤方案带来了革命性的变革。 一、芯海ADC芯片CS1237介绍 芯海ADC芯片CS1237是一款高性能…...
Leetcode的AC指南 —— 哈希表:202. 快乐数
摘要: Leetcode的AC指南 —— 哈希表:202. 快乐数。题目介绍:编写一个算法来判断一个数 n 是不是快乐数。 文章目录 一、题目二、解析1、哈希表 一、题目 题目介绍:编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为…...
机器学习 项目结构 数据预测 实验报告
需求: 我经过处理得到了测试值,然后进一步得到预测和真实值的比较,然后再把之前的所有相关的参数、评估指标、预测值、比较结果都存入excel,另外我还打算做测试报告模板,包括敏感性分析等。您建议我这些功能如何封装这些功能&…...

[Verilog] 设计方法和设计流程
主页: 元存储博客 文章目录 1. 设计方法2. 设计流程 3 Vivado软件设计流程总结 1. 设计方法 Verilog 的设计多采用自上而下的设计方法(top-down)。设计流程是指从一个项目开始从项目需求分析,架构设计,功能验证&#…...

C语言:指向数组的指针和指向数组元素的指针
相关阅读 C语言https://blog.csdn.net/weixin_45791458/category_12423166.html?spm1001.2014.3001.5482 指向数组的指针和指向数组元素的指针常常被混淆,或者笼统地被称为数组指针,但它们之间是有差别的,本文就将对此进行讨论。 下面的代码…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...

【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...

ubuntu系统文件误删(/lib/x86_64-linux-gnu/libc.so.6)修复方案 [成功解决]
报错信息:libc.so.6: cannot open shared object file: No such file or directory: #ls, ln, sudo...命令都不能用 error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory重启后报错信息&…...
Python实现简单音频数据压缩与解压算法
Python实现简单音频数据压缩与解压算法 引言 在音频数据处理中,压缩算法是降低存储成本和传输效率的关键技术。Python作为一门灵活且功能强大的编程语言,提供了丰富的库和工具来实现音频数据的压缩与解压。本文将通过一个简单的音频数据压缩与解压算法…...
RLHF vs RLVR:对齐学习中的两种强化方式详解
在语言模型对齐(alignment)中,强化学习(RL)是一种重要的策略。而其中两种典型形式——RLHF(Reinforcement Learning with Human Feedback) 与 RLVR(Reinforcement Learning with Ver…...

Qt/C++学习系列之列表使用记录
Qt/C学习系列之列表使用记录 前言列表的初始化界面初始化设置名称获取简单设置 单元格存储总结 前言 列表的使用主要基于QTableWidget控件,同步使用QTableWidgetItem进行单元格的设置,最后可以使用QAxObject进行单元格的数据读出将数据进行存储。接下来…...