SpringBoot 实现多个子域共享 cookie

news/2024/4/26 19:42:48/文章来源:https://blog.csdn.net/modelmd/article/details/130039891

SpringBoot 实现多个子域共享 cookie

  • 项目信息
  • cookie 共享
    • 需求
    • 如何实现
  • 环境配置
    • 配置域
    • SpringBoot 配置 https 访问
  • 后端代码
  • 验证
  • 验证后端解析 cookie

项目信息

使用SpringBoot web框架,版本号 2.7.10

		<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>

cookie 共享

需求

现在有两个域名 dev.scd.com.cn,test.scd.com.cn 的服务,登录验证之后,服务器写入 cookie 到响应头,用户只需要登录一次,访问任意一个域都携带cookie 信息

如何实现

后端服务写入cookie 指定domain为二级域名 .scd.com.cn
cookie基础知识

环境配置

配置域

本地模拟多个域的环境,需要在host 上配置域名,增加如下配置

127.0.0.1 dev.scd.com.cn
127.0.0.1 test.scd.com.cn

SpringBoot 配置 https 访问

application.properties 文件增加如下配置

# https
server.ssl.key-store=F:/keytool/https.p12
server.ssl.key-alias=tomcathttps
server.ssl.key-store-password=shootercheng

执行jdk 自带的命令行工具 keytool 生成证书

keytool -genkey -alias tomcathttps -keyalg RSA -keysize 4096 -keystore https.p12 -validity 365

参考地址
SpringBoot Https配置

后端代码

在 httpResponse 响应中增加 cookie

package com.scd.cookie.controller;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseCookie;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.time.Duration;/*** @author James* @date 2023/4/8*/
@RestController
@RequestMapping(value = "/cookie")
public class CookieController {private static final Logger LOGGER = LoggerFactory.getLogger(CookieController.class);private static final String COOKIE_DOMAIN = ".scd.com.cn";private static final int COOKIE_MAX_AGE_DAY = 7;private static final String COOKIE_KEY = "test_key";@GetMapping("/set")public String cookieSet(HttpServletResponse response) {Cookie cookie = new Cookie(COOKIE_KEY, "scd");cookie.setDomain(COOKIE_DOMAIN);cookie.setHttpOnly(true);cookie.setPath("/");cookie.setSecure(true);cookie.setMaxAge((int) Duration.ofDays(COOKIE_MAX_AGE_DAY).getSeconds());response.addCookie(cookie);return "OK";}@GetMapping("/get")public String cookieGet(HttpServletRequest request) {Cookie[] cookies = request.getCookies();for (Cookie cookie : cookies) {if (COOKIE_KEY.equals(cookie.getName())) {LOGGER.info("cookie name {} value {}", COOKIE_KEY, cookie.getValue());}return cookie.getValue();}return "OK";}
}

启动服务,访问 https://dev.scd.com.cn:8080/cookie/set
在这里插入图片描述
后端服务报错信息如下 An invalid domain [.scd.com.cn] was specified for this cookie

java.lang.IllegalArgumentException: An invalid domain [.scd.com.cn] was specified for this cookieat org.apache.tomcat.util.http.Rfc6265CookieProcessor.validateDomain(Rfc6265CookieProcessor.java:218) ~[tomcat-embed-core-9.0.73.jar:9.0.73]at org.apache.tomcat.util.http.Rfc6265CookieProcessor.generateHeader(Rfc6265CookieProcessor.java:153) ~[tomcat-embed-core-9.0.73.jar:9.0.73]at org.apache.catalina.connector.Response.generateCookieString(Response.java:970) ~[tomcat-embed-core-9.0.73.jar:9.0.73]at org.apache.catalina.connector.Response.addCookie(Response.java:923) ~[tomcat-embed-core-9.0.73.jar:9.0.73]at org.apache.catalina.connector.ResponseFacade.addCookie(ResponseFacade.java:314) ~[tomcat-embed-core-9.0.73.jar:9.0.73]at javax.servlet.http.HttpServletResponseWrapper.addCookie(HttpServletResponseWrapper.java:57) ~[tomcat-embed-core-9.0.73.jar:4.0.FR]at com.scd.cookie.controller.CookieController.cookieSet(CookieController.java:39) ~[classes/:na]at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_77]at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_77]at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_77]at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_77]at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) ~[spring-web-5.3.26.jar:5.3.26]at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150) ~[spring-web-5.3.26.jar:5.3.26]at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117) ~[spring-webmvc-5.3.26.jar:5.3.26]at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895) ~[spring-webmvc-5.3.26.jar:5.3.26]at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.26.jar:5.3.26]at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.26.jar:5.3.26]at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072) ~[spring-webmvc-5.3.26.jar:5.3.26]at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965) ~[spring-webmvc-5.3.26.jar:5.3.26]at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.26.jar:5.3.26]at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.26.jar:5.3.26]at javax.servlet.http.HttpServlet.service(HttpServlet.java:502) ~[tomcat-embed-core-9.0.73.jar:4.0.FR]at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.26.jar:5.3.26]at javax.servlet.http.HttpServlet.service(HttpServlet.java:596) ~[tomcat-embed-core-9.0.73.jar:4.0.FR]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:209) ~[tomcat-embed-core-9.0.73.jar:9.0.73]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.73.jar:9.0.73]at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.73.jar:9.0.73]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.73.jar:9.0.73]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.73.jar:9.0.73]at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.26.jar:5.3.26]at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.26.jar:5.3.26]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.73.jar:9.0.73]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.73.jar:9.0.73]at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.26.jar:5.3.26]at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.26.jar:5.3.26]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.73.jar:9.0.73]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.73.jar:9.0.73]at org.springframework.session.web.http.SessionRepositoryFilter.doFilterInternal(SessionRepositoryFilter.java:142) ~[spring-session-core-2.7.1.jar:2.7.1]at org.springframework.session.web.http.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:82) ~[spring-session-core-2.7.1.jar:2.7.1]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.73.jar:9.0.73]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.73.jar:9.0.73]at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.26.jar:5.3.26]at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.26.jar:5.3.26]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.73.jar:9.0.73]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.73.jar:9.0.73]at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) ~[tomcat-embed-core-9.0.73.jar:9.0.73]at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) [tomcat-embed-core-9.0.73.jar:9.0.73]at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:492) [tomcat-embed-core-9.0.73.jar:9.0.73]at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:130) [tomcat-embed-core-9.0.73.jar:9.0.73]at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) [tomcat-embed-core-9.0.73.jar:9.0.73]at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) [tomcat-embed-core-9.0.73.jar:9.0.73]at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) [tomcat-embed-core-9.0.73.jar:9.0.73]at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389) [tomcat-embed-core-9.0.73.jar:9.0.73]at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) [tomcat-embed-core-9.0.73.jar:9.0.73]at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:926) [tomcat-embed-core-9.0.73.jar:9.0.73]at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1791) [tomcat-embed-core-9.0.73.jar:9.0.73]at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.73.jar:9.0.73]at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) [tomcat-embed-core-9.0.73.jar:9.0.73]at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) [tomcat-embed-core-9.0.73.jar:9.0.73]at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.73.jar:9.0.73]

根据堆栈信息,发现报错的方法在校验域名时候产生的org.apache.tomcat.util.http.Rfc6265CookieProcessor#generateHeader(javax.servlet.http.Cookie, javax.servlet.http.HttpServletRequest)
org.apache.tomcat.util.http.Rfc6265CookieProcessor#validateDomain

	private void validateDomain(String domain) {int i = 0;int prev = true;int cur = -1;for(char[] chars = domain.toCharArray(); i < chars.length; ++i) {int prev = cur;cur = chars[i];if (!domainValid.get(cur)) {throw new IllegalArgumentException(sm.getString("rfc6265CookieProcessor.invalidDomain", new Object[]{domain}));}if ((prev == 46 || prev == -1) && (cur == 46 || cur == 45)) {throw new IllegalArgumentException(sm.getString("rfc6265CookieProcessor.invalidDomain", new Object[]{domain}));}if (prev == 45 && cur == 46) {throw new IllegalArgumentException(sm.getString("rfc6265CookieProcessor.invalidDomain", new Object[]{domain}));}}

如何绕过校验了,跟踪代码发现最终添加 cookie 的代码方法为
org.apache.catalina.connector.Response#addCookie
在这里插入图片描述
org.apache.catalina.connector.Response#addHeader(java.lang.String, java.lang.String, java.nio.charset.Charset)
在这里插入图片描述
最终是转换为字符串设置到 “Set-Cookie” 字符串的,可以使用如下方法直接设置

ResponseCookie cookie = ResponseCookie.from(COOKIE_KEY, "scd").httpOnly(true).secure(true).domain(COOKIE_DOMAIN).path("/").sameSite("Lax").maxAge(Duration.ofDays(COOKIE_MAX_AGE_DAY)).build();response.addHeader(HttpHeaders.SET_COOKIE, cookie.toString());

这样就绕过校验了。调整之后的代码如下:

package com.scd.cookie.controller;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseCookie;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.time.Duration;/*** @author James* @date 2023/4/8*/
@RestController
@RequestMapping(value = "/cookie")
public class CookieController {private static final Logger LOGGER = LoggerFactory.getLogger(CookieController.class);private static final String COOKIE_DOMAIN = ".scd.com.cn";private static final int COOKIE_MAX_AGE_DAY = 7;private static final String COOKIE_KEY = "test_key";@GetMapping("/set")public String cookieSet(HttpServletResponse response) {
//        Cookie cookie = new Cookie(COOKIE_KEY, "scd");
//        cookie.setDomain(COOKIE_DOMAIN);
//        cookie.setHttpOnly(true);
//        cookie.setPath("/");
//        cookie.setSecure(true);
//        cookie.setMaxAge((int) Duration.ofDays(COOKIE_MAX_AGE_DAY).getSeconds());
//        response.addCookie(cookie);ResponseCookie cookie = ResponseCookie.from(COOKIE_KEY, "scd").httpOnly(true).secure(true).domain(COOKIE_DOMAIN).path("/").sameSite("Lax").maxAge(Duration.ofDays(COOKIE_MAX_AGE_DAY)).build();response.addHeader(HttpHeaders.SET_COOKIE, cookie.toString());return "OK";}@GetMapping("/get")public String cookieGet(HttpServletRequest request) {Cookie[] cookies = request.getCookies();for (Cookie cookie : cookies) {if (COOKIE_KEY.equals(cookie.getName())) {LOGGER.info("cookie name {} value {}", COOKIE_KEY, cookie.getValue());}return cookie.getValue();}return "OK";}
}

验证

重启服务,之后访问 https://dev.scd.com.cn:8080/cookie/set,发现响应头设置cookie 成功
在这里插入图片描述
再次请求这个地址,请求头也携带了 cookie
在这里插入图片描述
访问 https://test.scd.com.cn:8080/cookie/set, 请求头也会携带cookie
在这里插入图片描述

验证后端解析 cookie

  1. 使用无痕模式,先访问 https://dev.scd.com.cn:8080/cookie/set
  2. 再访问地址 https://test.scd.com.cn:8080/cookie/get
    在这里插入图片描述
    在这里插入图片描述
    可以看到 cookie 在多个子域的请求都可以携带

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_283946.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第十四届蓝桥杯大赛软件赛省赛 C/C++ 大学 A 组 C题

平方差问题描述格式输入格式输出样例输入样例输出评测用例规模与约定解析参考程序问题描述 格式输入 输入一行包含两个整数 L, R&#xff0c;用一个空格分隔。 格式输出 输出一行包含一个整数满足题目给定条件的 x 的数量。 样例输入 1 5 样例输出 4 评测用例规模与约定 对…

Android Studio中通过SSH Key上传代码到Github

文章目录GitHub中的SSH配置一 检查SSH Key信息二 生成SSH Key信息三 获取SSH Key里的公钥内容四 Github上配置公钥GitHub中的SSH配置 我们在日常开发中请求登录后&#xff0c;服务端会根据登录信息生成一个该用户的唯一标识&#xff0c;如sessionId或者token&#xff0c;后续客…

深度学习中的自动编码器

嘈杂的数据仍然是让我们数据科学家夜不能寐的最常见的机器学习问题之一。 深度学习面对高维的非结构化数据&#xff08;图像、语音、文本&#xff09;&#xff0c;如何获取特征信息问题也是最头疼的问题。 然而&#xff0c;幸运的是&#xff0c;我们现在可以利用各种技术和技巧…

docker 执行springboot 报数据源找不到

本地运行springboot项目完全正常&#xff0c;在docker中开启容器&#xff0c;报错&#xff0c;如下&#xff1a; 解决方案&#xff1a;特别简单&#xff08;经过摸爬滚打得出来的结论&#xff09; <resources><resource><directory>src/main/resources</d…

Spark - AUC、Accuracy、Precision、Recall、F1-Score 理论与实战

一.引言 推荐场景下需要使用上述指标评估离、在线模型效果&#xff0c;下面对各个指标做简单说明并通过 spark 程序全部搞定。 二.指标含义 1.TP、TN、FP、FN 搜广推场景下最常见的就是 Ctr 2 分类场景&#xff0c;对于真实值 real 和预测值 pre 分别有 0 和 1 两种可能&…

Windows内核开发

Windows内核开发 Unit01对话框 对话框是一种很特殊的窗口&#xff0c;体现在消息的处理上 //普通窗口处理消息:自定义函数调用缺省消息处理函数 WndProc(...){...DefWindowProc(...); }//对话框窗口处理消息&#xff1a;缺省函数调用自定义函数 缺省函数(...){...自定义函数…

从繁琐的采集工作中解放出来,让拓客变得更高效

近年来&#xff0c;企业拓客发展越来越受到重视&#xff0c;但是拓客的过程中却面临着很多的挑战&#xff0c;其中最为繁琐的工作就是采集工作。采集工作不仅耗费大量的时间和精力&#xff0c;还容易出现误差和遗漏&#xff0c;影响到整个拓客的效率和质量。为了解决这个问题&a…

6.Swagger的实战使用

六.Swagger的实战使用 1.什么是swagger 2.swagger的基本使用 3.swagger实战使用 六.Swagger的实战使用 1.什么是swagger swagger是后端接口文档的生成并且提供ui界面进行测试过去用postman测试 缺点&#xff1a;需要自己写地址&#xff0c;如果项目变了需要自己更改 2.sw…

MySQL事务 【事务操作丨事务四大特性丨事务隔离级别丨事务原理】

在实际的开发过程中&#xff0c;一个业务操作如&#xff1a;转账&#xff0c;往往是要多次访问数据库才能完成的。转账是一个用户扣钱&#xff0c;另一个用户加钱。如果其中有一条 SQL 语句出现异常&#xff0c;这条 SQL 就可能执行失败。 事务是一组操作的集合&#xff0c;它…

计讯物联小型水库雨水情测报与大坝安全监测一体化解决方案,确保水库安全运行

方案背景 防洪治理工程是一项重大的民生工程&#xff0c;也是重大的生态工程。基于我国水灾频发的大背景下&#xff0c;小型水库作为防汛抗洪的重要基础设施&#xff0c;其雨水情测报与大坝安全监测是十分有必要的&#xff0c;不仅可为预防水灾、防汛决策提供大量可靠的数据和资…

深入浅出:理解 RPC 和 Dubbo 架构

简介 Apache Dubbo是一款高性能的Java RPC框架.其前身是阿里巴巴公司开源的一个高性能,轻量级的开源Java RPC框架,可以和Spring框架无缝集成. Dubbo 官网 RPC RPC介绍 Remote Procedure Call 远程过程调用,是分布式架构的核心,按响应方式分以下两种: 同步调用:客户端调用…

CAN通讯协议

1&#xff09; CAN介绍 a) 什么是CAN? b) CAN总线特点 c) CAN应用场景 2&#xff09;CAN物理层 a) CAN物理层特性 b) CAN收发器芯片介绍 3&#xff09;CAN协议层 a) CAN帧种类介绍 b) CAN数据帧介绍 c) CAN位时序介绍 d) CAN总线仲裁 a)、CAN介绍 CAN&#xff08;Controlle…

SpringBoot中配置文件加密及跨域支持

给application.properties文件中的某些值加密,比如数据库账号密码等. 引入依赖 <dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.3</version> </dep…

并行分布式计算 并行计算机体系结构

文章目录并行分布式计算 并行计算机体系结构并行计算机结构模型SIMD 单指令多数据流PVP 并行向量处理机SMP 对称多处理机MPP 大规模并行处理机DSM 分布式共享存储多处理机COW 工作站集群总结并行计算机访存模型UMA 均匀存储访问模型NUMA 非均匀存储访问模型COMA 全高速缓存存储…

Nestjs实战干货-概况-控制器-Controller

Controller 控制器 控制器负责处理传入的请求并向客户返回响应。 一个控制器的目的是接收应用程序的特定请求。路由机制控制哪个控制器接收哪些请求。通常&#xff0c;每个控制器有一个以上的路由&#xff0c;不同的路由可以执行不同的动作。 为了创建一个基本的控制器&#…

【游戏逆向】加密坐标浅析

这个游戏里面坐标有很多种存放方式。 例如明文存放的DOUBLE&#xff0c;加密的各种类型。 我们不知道哪一个对于我们是有用的,哪一些只是辅助UI或则掉到LUA虚拟机坑里的数据。 那就根据作用大小来决定,一一尝试吧。 最好去找修改之后有效果的地址&#xff0c;当然只是本地&…

MySQL中count(1)和count(*)哪个性能好?

当我们对某一张表中的数据需要统计数量的时候&#xff0c;我们通常会用到count(1)、count(*)或者count(字段)&#xff0c;而这三种哪个方式的count效率最高呢&#xff1f;先来说结论&#xff1a; count(1) count(*) > count(字段) 为什么会得到如上的结论&#xff0c;下面来…

1672_MIT 6.828 xv6中如何通过构建环境让系统中增加一个可执行调用文件

全部学习汇总&#xff1a; GreyZhang/g_unix: some basic learning about unix operating system. (github.com) 前面已经分析了如何实现一个系统调用&#xff0c;这个过程的梳理也已经整理成了一份学习笔记。这一次看一下&#xff0c;如何让OS的系统中增加这样的一个可执行的文…

Arduino2.0.4的安装以及上传错误:exit status2

一、安装并下载Arduino 可以进入到下面这个网站中下载会比较快。 Arduino IDE下载&#xff08;9月15日更新到2.0&#xff09;-Arduino爱好者 - Powered by Discuz! Arduino IDE下载&#xff08;9月15日更新到2.0&#xff09;-Arduino爱好者 - Powered by Discuz!Arduino IDE下…

【基于冗余缩减变换:Pan-Sharpening】

Pan-Sharpening Based on Transformer With Redundancy Reduction &#xff08;基于冗余缩减变换的全色锐化算法&#xff09; 基于深度神经网络&#xff08;DNN&#xff09;的泛锐化方法已经产生了最先进的结果。然而&#xff0c;在全色&#xff08;PAN&#xff09;图像和低空…