当前位置: 首页 > news >正文

SpringBoot 跨域请求处理全攻略:从原理到实践

文章目录

  • SpringBoot 如何处理跨域请求?你能说出几种方法?
    • 跨域请求概述
    • 跨域解决方案
      • 1. 使用@CrossOrigin注解
      • 2. 使用WebMvcConfigurer配置类
      • 3. 使用过滤器(Filter)
      • 4. 使用Spring Security处理CORS
      • 5.使用Spring Cloud Gateway处理CORS
    • 补充
      • 1. 预检请求(Preflight Requests)
      • 2. 其他注意事项
    • 总结
    • 思考
      • 1. 如何区分简单请求和复杂请求?
      • 2. 在实际项目中,如何选择合适的跨域请求解决方案?
      • 3. 如何处理凭证(Credentials)在跨域请求中的应用?

SpringBoot 如何处理跨域请求?你能说出几种方法?

在现代的Web开发中,跨域请求(Cross-Origin Resource Sharing,CORS)是一个常见的挑战。随着前后端分离架构的流行,前端应用通常运行在一个与后端 API 不同的域名或端口上,这就导致了浏览器的同源策略(Same-Origin Policy)的限制,从而出现了跨域请求问题。

Spring Boot 作为一种流行的 Java 后端框架,提供了多种处理跨域请求的方法,使得开发人员能够灵活地配置和管理跨域资源共享。本文将深入探讨几种常见的解决方案,帮助开发人员理解如何在 Spring Boot 应用中有效地处理跨域请求问题。

跨域请求概述

  1. 什么是跨域请求?
    跨域请求(Cross-Origin Request)指的是在浏览器环境下,前端代码发起的请求与当前页面的域名(或端口、协议)不同。浏览器的同源策略(Same-Origin Policy)限制了从一个源(域名、协议、端口组成的组合)加载的文档或脚本如何与来自另一个源的资源进行交互。

    具体来说,如果一个页面加载自 http://domain1.com,则它的同源策略默认限制了对 http://domain2.com 发起的请求。
    跨域问题是浏览器的一种安全策略,访问需要遵循同源策略:

URL说明是否允许通信
http://www.a.com/a.js http://www.a.com/b.js同一域名下允许
http://www.a.com/lab/a.js http://www.a.com/script/b.js 同一域名下不同文件夹允许
http://www.a.com:8000/a.js http://www.a.com/b.js同一域名,不同端口不允许
http://www.a.com/a.js https://www.a.com/b.js同一域名,不同协议不允许
http://www.a.com/a.js http://192.168.110.11/b.js域名和域名对应ip不允许
http://www.a.com/a.js http://script.a.com/b.js主域相同,子域不同不允许
http://www.a.com/a.js http://a.com/b.js同一域名,不同二级域名(同上)不允许(cookie这种情况下也不允许访问)
http://www.cnblogs.com/a.js http://www.a.com/b.js不同域名不允许
  1. 为什么会出现跨域问题?

    跨域问题的出现主要是为了保护用户数据和用户隐私安全。如果没有同源策略的限制,恶意网站可以利用当前用户的身份在其他网站上进行操作,如发送请求、读取数据,这可能导致信息泄露或潜在的安全威胁。

  2. 可能会导致的安全风险

    • 信息泄露:允许恶意网站读取其他网站的敏感数据。
    • CSRF(跨站请求伪造)攻击:如果没有适当的防护措施,允许攻击者伪造用户的请求并在用户不知情的情况下执行操作。
    • 恶意脚本注入:通过跨域请求注入恶意脚本,影响其他域上的安全性。

跨域解决方案

1. 使用@CrossOrigin注解

Spring 框架提供了@CrossOrigin注解,可以直接在 Controller 类或方法上使用,以声明允许来自特定源的请求。例如:

@RestController
@RequestMapping("/api")
public class MyController {@CrossOrigin(origins = "http://allowed-origin.com")@GetMapping("/data")public ResponseEntity<String> getData() {// 处理逻辑}
}

优点:简单直接,适用于简单的跨域场景。

缺点:无法进行更细粒度的配置,如请求方法、请求头等。

2. 使用WebMvcConfigurer配置类

通过自定义WebMvcConfigurer配置类,可以更灵活地配置跨域请求。例如:

@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/api/**").allowedOrigins("http://allowed-origin.com").allowedMethods("GET", "POST").allowedHeaders("header1", "header2").exposedHeaders("header3").allowCredentials(true).maxAge(3600);}
}

优点:可以精确控制允许的源、方法、头部等。

缺点:需要编写额外的配置类,相对比较复杂。

3. 使用过滤器(Filter)

通过自定义过滤器来处理跨域请求,这种方法可以在请求到达 Controller 之前进行处理。例如:

@Component
public class CorsFilter implements Filter {@Overridepublic void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)throws IOException, ServletException {HttpServletResponse response = (HttpServletResponse) res;HttpServletRequest request = (HttpServletRequest) req;response.setHeader("Access-Control-Allow-Origin", "http://allowed-origin.com");response.setHeader("Access-Control-Allow-Methods", "GET,POST");response.setHeader("Access-Control-Allow-Headers", "header1,header2");response.setHeader("Access-Control-Expose-Headers", "header3");response.setHeader("Access-Control-Allow-Credentials", "true");response.setHeader("Access-Control-Max-Age", "3600");chain.doFilter(req, res);}
}

优点:可以完全自定义跨域请求处理逻辑。

缺点:需要更多的Java编程经验,并且可能需要处理更复杂的跨域场景。
在使用Spring Security和Spring Cloud Gateway时,处理跨域请求(CORS)可以通过不同的方式实现。对于Spring Security,你可以在安全配置中添加CORS配置;而对于Spring Cloud Gateway,你可以使用全局过滤器或者特定的路由过滤器来处理CORS。

4. 使用Spring Security处理CORS

在Spring Security中,你可以在WebSecurityConfigurerAdapter的配置类中添加一个CorsConfigurationSource来指定CORS策略。但是,如果你使用的是Spring Security 5.3及以上版本,推荐使用WebSecurityCustomizer来配置CORS。

示例代码如下:

@Configuration
@EnableWebSecurity
public class SecurityConfig {@Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http.cors().and().csrf().disable().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and().authorizeRequests()// ... your authorization rules here.anyRequest().authenticated();http.addFilterBefore(new JWTAuthenticationTokenFilter(), UsernamePasswordAuthenticationFilter.class);return http.build();}@BeanCorsConfigurationSource corsConfigurationSource() {CorsConfiguration configuration = new CorsConfiguration();configuration.setAllowedOrigins(Arrays.asList("*"));configuration.setAllowedMethods(Arrays.asList("GET","POST","PUT","DELETE","OPTIONS"));configuration.setAllowedHeaders(Arrays.asList("Authorization", "Cache-Control", "Content-Type"));UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();source.registerCorsConfiguration("/**", configuration);return source;}
}

5.使用Spring Cloud Gateway处理CORS

在Spring Cloud Gateway中,你可以在全局过滤器中添加CORS处理逻辑,或者在每个路由上单独配置CORS。这里是一个使用全局过滤器的例子:

@Configuration
public class CorsConfig {@Beanpublic GatewayFilter globalCorsFilter() {CorsConfiguration corsConfig = new CorsConfiguration();corsConfig.setAllowCredentials(true);corsConfig.addAllowedOriginPattern("*");corsConfig.addAllowedHeader(HttpHeaders.AUTHORIZATION);corsConfig.addAllowedHeader(HttpHeaders.CONTENT_TYPE);corsConfig.addAllowedMethod(HttpMethod.GET.name());corsConfig.addAllowedMethod(HttpMethod.POST.name());corsConfig.addAllowedMethod(HttpMethod.PUT.name());corsConfig.addAllowedMethod(HttpMethod.DELETE.name());corsConfig.addAllowedMethod(HttpMethod.OPTIONS.name());List<String> allowedMethods = corsConfig.getAllowedMethods();corsConfig.setExposedHeaders(allowedMethods.stream().map(method -> "X-Permitted-Cross-Domain-Policies").collect(Collectors.toList()));CorsGatewayFilterFactory corsGatewayFilterFactory = new CorsGatewayFilterFactory(corsConfig);return corsGatewayFilterFactory.apply(new CorsConfig().new CorsConfigCustomizer());}public static class CorsConfigCustomizer implements CorsGatewayFilterFactory.CorsConfigurationCustomizer {@Overridepublic void customize(CorsConfiguration corsConfiguration) {corsConfiguration.setMaxAge(3600L);}}
}

请注意,这些示例代码需要根据你的具体需求进行调整。例如,你可能需要限制允许的源,或者修改其他CORS设置。

补充

1. 预检请求(Preflight Requests)

跨域请求中,某些复杂请求(如带有自定义头部的请求、使用某些特殊方法如PUTDELETE等的请求)会触发浏览器先发送一个预检请求(OPTIONS请求)到服务器,以确定是否允许实际的请求。预检请求包含以下头部信息:

  • Origin:表明发起请求的源。
  • Access-Control-Request-Method:实际请求将使用的HTTP方法。
  • Access-Control-Request-Headers:实际请求将使用的自定义头部。

服务器需要正确响应预检请求,以确保浏览器安全地执行实际请求。
处理预检请求的方法:

  1. 使用@CrossOrigin注解处理

    	@CrossOrigin(origins = "http://allowed-origin.com", methods = {RequestMethod.GET, RequestMethod.POST}, allowedHeaders = {"header1", "header2"})@RequestMapping(value = "/api/data", method = RequestMethod.OPTIONS)public ResponseEntity<Void> preflight() {return ResponseEntity.ok().build();}
    

    Controller中定义一个处理OPTIONS请求的方法,并使用@CrossOrigin注解指定允许的源、方法和头部。

  2. 通过WebMvcConfigurer配置类处理

    @Configuration
    public class WebConfig implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/api/**").allowedOrigins("http://allowed-origin.com").allowedMethods("GET", "POST").allowedHeaders("header1", "header2").exposedHeaders("header3").allowCredentials(true).maxAge(3600);}@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/api/**").allowedOrigins("http://allowed-origin.com").allowedMethods("GET", "POST").allowedHeaders("header1", "header2").exposedHeaders("header3").allowCredentials(true).maxAge(3600);}
    }
    

    WebMvcConfigurer配置类中,通过重写addCorsMappings方法来定义预检请求的处理方式。

2. 其他注意事项

Credentials(凭证)的处理
如果请求需要使用凭证(如使用CookieHTTP认证信息等),需要确保在跨域请求中设置Access-Control-Allow-Credentialstrue,并在客户端请求中设置withCredentialstrue

暴露自定义头部
如果需要在响应中暴露某些自定义头部供客户端访问,可以通过Access-Control-Expose-Headers头部指定。

缓存控制
可以通过Access-Control-Max-Age头部指定预检请求的缓存时间,减少重复发送预检请求的次数,提升性能。

总结

避免跨域请求问题不仅仅是简单地允许跨域请求,还需要正确处理预检请求及相关细节。通过使用@CrossOrigin注解、自定义WebMvcConfigurer配置类或过滤器来处理跨域请求,可以有效地保证跨域请求的安全性和可靠性。同时,要特别注意凭证的处理及其他相关头部信息的配置,确保跨域请求能够在安全、可控的环境下完成。

思考

1. 如何区分简单请求和复杂请求?

跨域资源共享(CORS)规范将跨域请求分为两类:简单请求和预检请求(复杂请求)。区分这两类请求主要基于以下几个因素:

简单请求:

  • 方法:请求方法必须是以下之一:GET, HEAD, POST
  • 头信息:请求头中的字段不能包含除了Accept, Accept-Language, Content-Language, Last-Event-ID, Content-Type之外的自定义头部,且Content-Type的值只能是以下几种之一:application/x-www-form-urlencoded, multipart/form-data, 或者 text/plain
  • 数据类型:如果是POST请求,发送的数据必须符合上述Content-Type的规定。

复杂请求(预检请求):

  • 如果请求不符合上述简单请求的标准,则被视为复杂请求。浏览器会先发送一个OPTIONS请求到服务器,这个请求称为预检请求,用于确认服务器是否支持跨域请求以及具体的请求方法和头部信息。

预检请求包含了实际请求的所有关键信息,包括请求方法、请求头部等,服务器通过预检请求响应告知客户端是否可以继续发送实际的请求。

2. 在实际项目中,如何选择合适的跨域请求解决方案?

选择跨域请求解决方案主要考虑以下几个方面:

  • 安全性:确保跨域访问不会导致安全漏洞,比如XSS攻击或CSRF攻击。
  • 性能:预检请求会增加额外的网络延迟,因此在设计API时应尽量避免不必要的复杂请求。
  • 功能需求:根据API的功能需求确定哪些HTTP方法和头信息是必要的,这将影响请求的类型。
  • 易用性:为开发者提供清晰的文档和示例,说明哪些资源可以被跨域访问,以及如何正确地设置请求头。

在Spring框架下,可以采用以下策略:

  • 使用Spring Security或Spring MVC的内置CORS支持,通过配置类来指定CORS策略。
  • 在Spring Cloud Gateway中,通过全局过滤器或路由级过滤器来处理CORS,这样可以更细粒度地控制跨域策略。

3. 如何处理凭证(Credentials)在跨域请求中的应用?

凭证通常指的是Cookie和HTTP认证信息(如Basic Auth),它们在跨域请求中默认是不会被发送的。如果需要发送凭证,需要在CORS策略中显式地允许:

  • 在服务器端,需要在CORS响应头中添加Access-Control-Allow-Credentials: true
  • 在客户端,当发起请求时,需要将withCredentials属性设置为true

示例代码:

服务端配置(Spring Security)

CorsConfiguration corsConfig = new CorsConfiguration();
corsConfig.setAllowCredentials(true); // 允许发送凭证

客户端调用(JavaScript/AJAX)

fetch('http://example.com/api', {method: 'GET',credentials: 'include', // 发送凭证
});

请注意,一旦允许了凭证的发送,所有跨域请求都必须遵循CORS策略,并且不能缓存预检请求的结果。此外,由于凭证的发送增加了安全风险,因此在配置时要格外小心,确保只对可信的源开放凭证权限。

Nginx 作为一款高性能的 HTTP 和反向代理服务器,可以用来处理跨域请求(CORS),关于Nginx相关的知识可以去看这篇文章:《Nginx——高性能Web服务器的基石,解锁Nginx的超级技能:从基础到实战的全方位指南》

相关文章:

SpringBoot 跨域请求处理全攻略:从原理到实践

文章目录 SpringBoot 如何处理跨域请求&#xff1f;你能说出几种方法&#xff1f;跨域请求概述跨域解决方案1. 使用CrossOrigin注解2. 使用WebMvcConfigurer配置类3. 使用过滤器&#xff08;Filter&#xff09;4. 使用Spring Security处理CORS5.使用Spring Cloud Gateway处理CO…...

vulnhub——Ai-Web1靶机渗透

Ai-Web1靶机渗透 靶机下载&#xff1a; 官网地址&#xff1a;https://www.vulnhub.com/entry/ai-web-1,353/ 攻击机&#xff1a;kali2024 一、信息收集 发下目标主机的IP为&#xff1a;192.168.201.141 用nmap工具扫描一下对方主机和服务 发现他打开了80端口 发现搜不到于是…...

sqlalchemy事件监听

sqlalchemy事件监听 SQLAlchemy 中的事件监听允许您在特定事件发生时执行自定义的 Python 代码。这些事件可以是与ORM(对象关系映射)或核心组件相关的操作,比如表、类、会话或事务的插入、更新、删除等操作。通过事件监听,您可以实现日志记录、审计或执行业务规则等功能。…...

【Django+Vue3 线上教育平台项目实战】Celery赋能:优化订单超时处理与自动化定时任务调度

文章目录 前言⭐✨&#x1f4ab;&#x1f525;&#x1f4d6;一、Celery⭐1.基本概念及介绍:✨2.使用步骤&#x1f4ab; 二、订单超时 取消订单&#xff08;Celery&#xff09;&#x1f525;具体实现流程&#x1f4d6; 前言⭐✨&#x1f4ab;&#x1f525;&#x1f4d6; 在构建复…...

CSS3 教程

CSS3 教程 引言 CSS3&#xff0c;即层叠样式表的第三代&#xff0c;是网页设计和开发中不可或缺的技术之一。它为HTML元素提供了丰富的样式定义&#xff0c;使得网页不仅内容丰富&#xff0c;而且外观美观、交互性强。本教程将详细介绍CSS3的基础知识、高级特性以及最佳实践&…...

树与二叉树学习笔记

树与二叉树 计算机中的树树的概念树的类型 什么是二叉树二叉树&#xff1a;定义与特点二叉树&#xff1a;前序、中序、后序遍历二叉树&#xff1a;深度、广度优先遍历二叉树&#xff1a;线索化二叉树&#xff1a;序列化与反序列化 haffman树平均编码长度构建haffman树haffman树…...

消费金融系统开发回忆录

架构设计图 整个支付链路上的功能 支付系统应该有&#xff1a;账户管理、渠道管理、支付管理、对账管理、清算管理、结算管理 一笔支付订单&#xff0c;在支付系统侧就是要记录清楚&#xff0c;谁发起的、对哪个商品进行支付、通过哪个渠道支付、支付时间、支付结果等…...

org.springframework.context.ApplicationContext发送消息

1、创建消息的实体类 package com.demo;/*** 监听的实体类**/ public class EventMessage {private String name;public EventMessage(String name) {this.name name;}public String getName() {return name;}public void setName(String name) {this.name name;} }2、创建消…...

Java8-21新特性

简介 由于Java官方最近更新越来越频繁&#xff0c;而长期支持维护的版本LTS版每隔几年才推出一个&#xff0c;大规模商用的JDK只可能选择LTS版&#xff0c;因此这里只简单记录JDK8&#xff0c;11&#xff0c;17&#xff0c;21。 jdk8 Lambda表达式&#xff1a; Lambda表达式…...

NodeJS系列面试题

大家好&#xff0c;我是有用就扩散&#xff0c;有用就点赞。 有没有写过Koa中间件&#xff0c;说一下中间件原理&#xff0c;介绍下自己写过的中间件 koa本来就是一个轻量级框架&#xff0c;本身支持的功能并不多&#xff0c;功能都是通过中间件来实现不同的需求。开发者可以通…...

QXlsx读写excel

QXlsx读写excel 安装 QXlsx使用 qmake使用 CMake 基本用法1. 写入 Excel 文件2. 读取 Excel 文件 详细用法1. 设置单元格样式2. 合并单元格3. 创建图表4. 设置列宽和行高 完整示例 QXlsx 是一个用于在 Qt 应用中读写 Excel 文件的第三方库。它提供了丰富的 API&#xff0c;可以…...

昇思25天学习打卡营第13天 | mindspore 实现 ShuffleNet 图像分类

1. 背景&#xff1a; 使用 mindspore 学习神经网络&#xff0c;打卡第 13 天&#xff1b;主要内容也依据 mindspore 的学习记录。 2. 迁移学习介绍&#xff1a; mindspore 实现 ShuffleNet 图像分类&#xff1b; ShuffleNet 基本介绍&#xff1a; ShuffleNetV1 是旷视科技提…...

C语言超市管理系统UI界面

以下是部分代码。需要源码的私信 #include<easyx.h> #include<stdio.h> #include<stdlib.h>#define width 1280 #define height 840 #define font_w 35 //字体宽度 #define font_h 90 //字体高度typedef struct node {char name[100];//名字char number[1…...

BUUCTF逆向wp [MRCTF2020]Xor

第一步 查壳&#xff0c;该题是32位&#xff0c;无壳。 第二步 跟进main&#xff0c;发现反汇编不了 通过下图我们可以发现一串类似字符串的东西 第三步 我们看一下汇编 我们可以得到这些信息&#xff1a;flag的长度为27&#xff08;下面是对本条指令cmp edx 27指令的应用…...

Windows版MySQL5.7解压直用(如何卸载更换位置重新安装)

文章目录 停止mysql进程及服务迁移整个mysql文件夹删除data重启计算机重新安装 停止mysql进程及服务 net stop mysql mysqld -remove mysql迁移整个mysql文件夹 删除data 重启计算机 shutdown -r -t 0重新安装 https://blog.csdn.net/xzzteach/article/details/137723185...

详解数据结构之二叉树(堆)

详解数据结构之二叉树(堆) 树 树的概念 树是一个非线性结构的数据结构&#xff0c;它是由 n(n>0)个有限节点组成的一个具有层次关系的集合&#xff0c;它的外观形似一颗倒挂着的树&#xff0c;根朝上&#xff0c;叶朝下&#xff0c;所以称呼为树。每颗子树的根节点有且只…...

Linux----Mplayer音视频库的移植

想要播放视频音乐就得移植相关库到板子上 Mplayer移植需要依赖以下源文件&#xff1a;(从官网获取或者网上) 1、zlib-1.2.3.tar.gz &#xff1a;通用的内存空间的压缩库。 2、libpng-1.2.57.tar.gz :png格式图片的压缩或解压库 3、Jpegsrc.v9b.tar.gz : jpeg格式图片的压…...

STM32测测速---编码电机读取速度的计算

1、首先先了解一下计算的公式 速度计算&#xff1a; 轮胎每转一圈的脉冲数取决于编码器的分辨率&#xff0c;可由下面公式进行计算&#xff1a; PPR是电机的线数 以GA25-370电机为例。 图片来源&#xff1a;第四节&#xff1a;STM32定时器&#xff08;4.JGA25-370霍尔编码器…...

【已解决】服务器无法联网与更换镜像源

目录 问题描述&#xff1a; 1.修改网卡的 DNS1 和 DNS2 2.修改DNS列表 3.重启网络服务 4.切换镜像源 4.1备份原镜像源 4.2下载阿里云镜像源 4.3替换无法使用的域名 4.4刷新软件包缓存 4.5其他镜像源 5.阿里云镜像源开发者社区说明 6.阿里云DNS网址 7.DNS域名服务器…...

android11 屏蔽usb通过otg转接口外接鼠标设备

硬件平台&#xff1a;QCS6125 软件平台&#xff1a;Android11 需求&#xff1a;Android设备通过接usb转接线连接鼠标功能屏蔽。 考虑到屏蔽的层面可以从两个层面去做&#xff0c;一个是驱动层面不识别&#xff0c;一个就是Android系统层面不识别加载&#xff0c;本篇只讲后者。…...

HAL库源码移植与使用之RTC时钟

实时时钟(Real Time Clock&#xff0c;RTC)&#xff0c;本质是一个计数器&#xff0c;计数频率常为秒&#xff0c;专门用来记录时间。 普通定时器无法掉电运行&#xff01;但RTC可由VBAT备用电源供电&#xff0c;断电不断时 这里讲F1系列的RTC 可以产生三个中断信号&#xff…...

GIT命令学习 一

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 ☁️运维工程师的职责&#xff1a;监…...

VS+QT 打包可执行文件.exe

切换成release版本&#xff0c;同时更改项目属性中release配置下的各个属性&#xff0c;确保匹配 重新生成解决方案&#xff0c;将生成的.exe复制到一个空白文件夹中 执行&#xff1a; cd D:\QT\5.12.10\msvc2015_64\binwindeployqt C:\Users\DELL\Desktop\serials\MainWind…...

Android笔试面试题AI答之Activity(2)

答案仅供参考&#xff0c;大部分为文心一言AI作答 目录 1. 请介绍一下Activity 生命周期&#xff1f;1. 完全生命周期2. 可见生命周期3. 前台生命周期4. 配置更改5. 特殊场景 2. 请介绍一下横竖屏切换时Activity的生命周期变化&#xff1f;1.默认行为&#xff08;未设置androi…...

来自Transformers的双向编码器表示(BERT) 通俗解释

来自Transformers的双向编码器表示&#xff08;BERT&#xff09; 目录 1. 从上下文无关到上下文敏感2. 从特定于任务到不可知任务3. BERT&#xff1a;把两个最好的结合起来4. BERT的输入表示5. 掩蔽语言模型&#xff08;Masked Language Modeling&#xff09;6. 下一句预测&am…...

代码随想录第十六天|贪心算法(2)

目录 LeetCode 134. 加油站 LeetCode 135. 分发糖果 LeetCode 860. 柠檬水找零 LeetCode 406. 根据身高重建队列 LeetCode 452. 用最少数量的箭引爆气球 LeetCode 435. 无重叠区间 LeetCode 763. 划分字母区间 LeetCode 56. 合并区间 LeetCode 738. 单调递增的数字 总…...

花几千上万学习Java,真没必要!(二十二)

1、final关键字&#xff1a; 测试代码1&#xff1a; package finaltest.com;public class FinalBasicDemo {public static void main(String[] args) {// final修饰基本数据类型变量final int number 5;// 尝试修改number的值&#xff0c;这将导致编译错误// number 10; // …...

在RK3568上如何烧录MAC?

这里我们用RKDevInfoWriteTool 1.1.4版本 下载地址&#xff1a;https://pan.baidu.com/s/1Y5uNhkyn7D_CjdT98GrlWA?pwdhm30 提 取 码&#xff1a;hm30 烧录过程&#xff1a; 1. 解压RKDevInfoWriteTool_Setup_V1.4_210527.7z 进入解压目录&#xff0c;双击运行RKDevInfo…...

1.30、基于卷积神经网络的手写数字旋转角度预测(matlab)

1、卷积神经网络的手写数字旋转角度预测原理及流程 基于卷积神经网络的手写数字旋转角度预测是一个常见的计算机视觉问题。在这种情况下&#xff0c;我们可以通过构建一个卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;CNN&#xff09;来实现该任务。以下…...

Windows如何使用Python的sphinx

在Windows上使用Python的Sphinx进行文档渲染和呈现&#xff0c;‌可以遵循以下步骤进行操作&#xff1a;‌ 安装Python&#xff1a;‌首先&#xff0c;‌确保你的Windows系统上已经安装了Python。‌你可以从Python的官方网站下载并安装适合你系统&#xff08;‌32位或64位&…...

C++ STL nth_element 用法

一&#xff1a;功能 将一个序列分为两组&#xff0c;前一组元素都小于*nth&#xff0c;后一组元素都大于*nth&#xff0c; 并且确保第 nth 个位置就是排序之后所处的位置。即该位置的元素是该序列中第nth小的数。 二&#xff1a;用法 #include <vector> #include <a…...

【PostgreSQL教程】PostgreSQL 选择数据库

博主介绍:✌全网粉丝20W+,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物联网、机器学习等设计与开发。 感兴趣的可…...

C# —— HashTable

集合collections命名空间&#xff0c;专门进行一系列的数据存储和检索的类&#xff0c;主要包含了:堆栈、和队列、list、ArrayList、数组 HashTable 字典 storeList 排序列表等类 Array 数组 长度固定&#xff0c; 类型固定 通过索引值来进行访问 ArrayList动态数组&#xff0c…...

LeetCode 第407场周赛个人题解

目录 100372. 使两个整数相等的位更改次数 原题链接 思路分析 AC代码 100335. 字符串元音游戏 原题链接 思路分析 AC代码 100360. 将 1 移动到末尾的最大操作次数 原题链接 思路分析 AC代码 100329. 使数组等于目标数组所需的最少操作次数 原题链接 思路分析 A…...

使用Django框架实现音频上传功能

数据库设计&#xff08;models.py&#xff09; class Music(models.Model):""" 音乐 """name models.CharField(verbose_name"音乐名字", max_length32)singer models.CharField(verbose_name"歌手", max_length32)# 本质…...

[路由器]IP-MAC的绑定与取消

背景&#xff1a;当公司的网络不想与外部人员进行共享&#xff0c;可以在路由器页面配置IP-MAC的绑定&#xff0c;让公司内部人员的手机和电脑的mac&#xff0c;才能接入到公司。第一步&#xff1a;在ARP防护中&#xff0c;启动IP-MAC绑定选项&#xff0c;必须启动仅允许IP-MAC…...

Idea配置远程开发

Idea配置远程开发 本篇博客介绍使用idea通过ssh连接ubuntu服务器进行开发 目录 Idea配置远程开发1.idae上点击file->Remote Development2.点击New Connection3.填写相关信息4.输入密码5.选择IDE版本和项目路径5.1 点击open an SSH terminal打开控制台5.2 依次执行命令 6.成…...

lua 实现 函数 判断两个时间戳是否在同一天

函数用于判断两个时间戳是否在同一天。下面是对代码的详细解释&#xff1a; ### 函数参数 - stampA 和 stampB&#xff1a;两个时间戳&#xff0c;用于比较。- resetInfo&#xff1a;一个可选参数&#xff0c;包含小时、分钟和秒数&#xff0c;用于调整时间戳。 ### 函数实现…...

工作纪实53-log4j日志打印文件隔离

在项目中&#xff0c;我有一堆业务日志需要打印&#xff0c;另一部分的日志&#xff0c;是没有格式的&#xff0c;需要被云平台离线解析并收集到kafka或者hdfs、hive等&#xff0c;需要将日志隔离打印到不同的文件 正常的log4j配置是下面这样的&#xff0c;配合Sl4j直接使用默认…...

7月21日,贪心练习

大家好呀&#xff0c;今天带来一些贪心算法的应用解题、 一&#xff0c;柠檬水找零 . - 力扣&#xff08;LeetCode&#xff09; 解析&#xff1a; 本题的贪心体现在对于20美元的处理上&#xff0c;我们总是优先把功能较少的10元作为找零&#xff0c;这样可以让5元用处更大 …...

FPGA DNA 获取 DNA_PORT

FPGA DNA DNA 是 FPGA 芯片的唯一标识&#xff0c; FPGA 都有一个独特的 ID &#xff0c;也就是 Device DNA &#xff0c;这个 ID 相当于我们的身份证&#xff0c;在 FPGA 芯片生产的时候就已经固定在芯片的 eFuse 寄存器中&#xff0c;具有不可修改的属性。在 xilinx 7series…...

使用 hutool工具实现导入导出功能。

hutool工具网址 Hutool参考文档 pom依赖 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.20</version></dependency><dependency><groupId>org.apache.poi</gro…...

大语言模型-Transformer-Attention Is All You Need

一、背景信息&#xff1a; Transformer是一种由谷歌在2017年提出的深度学习模型。 主要用于自然语言处理&#xff08;NLP&#xff09;任务&#xff0c;特别是序列到序列&#xff08;Sequence-to-Sequence&#xff09;的学习问题&#xff0c;如机器翻译、文本生成等。Transfor…...

spring(二)

一、为对象类型属性赋值 方式一&#xff1a;(引用外部bean) 1.创建班级类Clazz package com.spring.beanpublic class Clazz {private Integer clazzId;private String clazzName;public Integer getClazzId() {return clazzId;}public void setClazzId(Integer clazzId) {th…...

MAC 数据恢复软件: STELLAR Data Recovery For MAC V. 12.1 更多增强功能

天津鸿萌科贸发展有限公司是 Stellar 系列软件的授权代理商。 STELLAR Data Recovery For MAC 该数据恢复软件可从任何存储驱动器、清空的回收站以及崩溃或无法启动的 Mac 设备中恢复丢失或删除的文件。 轻松恢复已删除的文档、照片、音频文件和视频。自定义扫描以帮助恢复特…...

初识godot游戏引擎并安装

简介 Godot是一款自由开源、由社区驱动的2D和3D游戏引擎。游戏开发虽复杂&#xff0c;却蕴含一定的通用规律&#xff0c;正是为了简化这些通用化的工作&#xff0c;游戏引擎应运而生。Godot引擎作为一款功能丰富的跨平台游戏引擎&#xff0c;通过统一的界面支持创建2D和3D游戏。…...

Windows配置Qt+VLC

文章目录 前言下载库文件提取文件编写qmakeqtvlc测试代码 总结 前言 在Windows平台上配置Qt和VLC是开发多媒体应用程序的一个重要步骤。Qt作为一个强大的跨平台应用开发框架&#xff0c;为开发人员提供了丰富的GUI工具和库&#xff0c;而VLC则是一个开源的多媒体播放器&#x…...

本地部署 mistralai/Mistral-Nemo-Instruct-2407

本地部署 mistralai/Mistral-Nemo-Instruct-2407 1. 创建虚拟环境2. 安装 fschat3. 安装 transformers4. 安装 flash-attn5. 安装 pytorch6. 启动 controller7. 启动 mistralai/Mistral-Nemo-Instruct-24078. 启动 api9. 访问 mistralai/Mistral-Nemo-Instruct-2407 1. 创建虚拟…...

2月科研——arcgis计算植被差异

ArcGIS中&#xff0c;设置高于或低于某个值的像元为 -9999&#xff0c;然后将这些地方设为空——目的&#xff1a;去除异常值和黑色背景值 Con(("T_std ano7.tif" > 2) | ("T_std ano7.tif" < - 2), - 9999,"T_std ano7.tif") SetNull(&…...

深入理解Android中的缓存与文件存储目录

&#x1f31f; 引言 在Android应用开发中&#xff0c;合理管理应用的数据存储至关重要。应用可能需要保存各种类型的数据&#xff0c;从简单的配置信息到多媒体文件&#xff0c;甚至是缓存数据以提高性能和用户体验。Android提供了多个内置目录来满足这些需求&#xff0c;但它…...