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

接受Header使用错Map类型,导致获取到的Header值不全

问题复现

  • 在 Spring 中解析 Header 时,我们在多数场合中是直接按需解析的。例如,我们想使用一个名为 myHeaderName 的 Header,我们会书写代码如下:
    @RequestMapping(path = "/hi", method = RequestMethod.GET)
    public String hi(@RequestHeader("myHeaderName") String name){//省略 body 处理
    };
    
  • 定义一个参数,标记上 @RequestHeader,指定要解析的 Header 名即可。但是假设我们需要解析的 Header 很多时,按照上面的方式很明显会使得参数越来越多。在这种情况下,我们一般都会使用 Map 去把所有的 Header 都接收到,然后直接对 Map 进行处理。于是我们可能会写出下面的代码:
    @RequestMapping(path = "/hi1", method = RequestMethod.GET)
    public String hi1(@RequestHeader() Map map){return map.toString();
    };
    
  • 粗略测试程序,你会发现一切都很好。而且上面的代码也符合针对接口编程的范式,即使用了 Map 这个接口类型。但是上面的接口定义在遇到下面的请求时,就会超出预期。请求如下:

    GET http://localhost:8080/hi1
    myheader: h1
    myheader: h2

  • 这里存在一个 Header 名为 myHeader,不过这个 Header 有两个值。此时我们执行请求,会发现返回的结果并不能将这两个值如数返回。结果示例如下:

    {myheader=h1, host=localhost:8080, connection=Keep-Alive, user-agent=Apache-HttpClient/4.5.12 (Java/11.0.6), accept-encoding=gzip,deflate}

案例解析

  • 实际上,当我们看到这个测试结果,大多数同学已经能反应过来了。对于一个多值的 Header,在实践中,通常有两种方式来实现,一种是采用下面的方式:

    Key: value1,value2,

  • 而另外一种方式就是我们测试请求中的格式:

    Key:value1
    Key:value2

  • 对于方式 1,我们使用 Map 接口自然不成问题。但是如果使用的是方式 2,我们就不能拿到所有的值。这里我们可以翻阅代码查下 Map 是如何接收到所有请求的。

  • 对于一个 Header 的解析,主要有两种方式,分别实现在 RequestHeaderMethodArgumentResolver 和 RequestHeaderMapMethodArgumentResolver 中,它们都继承于 AbstractNamedValueMethodArgumentResolver,但是应用的场景不同,我们可以对比下它们的 supportsParameter(),来对比它们适合的场景:
    在这里插入图片描述

  • 在上图中,左边是 RequestHeaderMapMethodArgumentResolver 的方法。通过比较可以发现,对于一个标记了 @RequestHeader 的参数,如果它的类型是 Map,则使用 RequestHeaderMapMethodArgumentResolver,否则一般使用的是 RequestHeaderMethodArgumentResolver。

  • 在我们的案例中,很明显,参数类型定义为 Map,所以使用的自然是 RequestHeaderMapMethodArgumentResolver。接下来,我们继续查看它是如何解析 Header 的,关键代码参考 resolveArgument():

    @Override
    public Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer,NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception {Class<?> paramType = parameter.getParameterType();if (MultiValueMap.class.isAssignableFrom(paramType)) {MultiValueMap<String, String> result;if (HttpHeaders.class.isAssignableFrom(paramType)) {result = new HttpHeaders();}else {result = new LinkedMultiValueMap<>();}for (Iterator<String> iterator = webRequest.getHeaderNames(); iterator.hasNext();) {String headerName = iterator.next();String[] headerValues = webRequest.getHeaderValues(headerName);if (headerValues != null) {for (String headerValue : headerValues) {result.add(headerName, headerValue);}}}return result;}else {Map<String, String> result = new LinkedHashMap<>();for (Iterator<String> iterator = webRequest.getHeaderNames(); iterator.hasNext();) {String headerName = iterator.next();//只取了一个“值”String headerValue = webRequest.getHeader(headerName);if (headerValue != null) {result.put(headerName, headerValue);}}return result;}
    }
    
  • 针对我们的案例,这里并不是 MultiValueMap,所以我们会走入 else 分支。这个分支首先会定义一个 LinkedHashMap,然后将请求一一放置进去,并返回。其中第 29 行是去解析获取 Header 值的实际调用,在不同的容器下实现不同。例如在 Tomcat 容器下,它的执行方法参考 MimeHeaders#getValue:

    public MessageBytes getValue(String name) {for (int i = 0; i < count; i++) {if (headers[i].getName().equalsIgnoreCase(name)) {return headers[i].getValue();}}return null;
    }
    
  • 当一个请求出现多个同名 Header 时,我们只要匹配上任何一个即立马返回。所以在本案例中,只返回了一个 Header 的值。

  • 其实换一个角度思考这个问题,毕竟前面已经定义的接收类型是 LinkedHashMap,它的 Value 的泛型类型是 String,也不适合去组织多个值的情况。综上,不管是结合代码还是常识,本案例的代码都不能获取到 myHeader 的所有值。

问题修正

  • 现在我们要修正这个问题。在案例解析部分,其实已经给出了答案。

  • 在 RequestHeaderMapMethodArgumentResolver 的 resolveArgument() 中,假设我们的参数类型是 MultiValueMap,我们一般会创建一个 LinkedMultiValueMap,然后使用下面的语句来获取 Header 的值并添加到 Map 中去:String[] headerValues = webRequest.getHeaderValues(headerName)

  • 参考上面的语句,不用细究,我们也能看出,我们是可以获取多个 Header 值的。另外假设我们定义的是 HttpHeaders(也是一种 MultiValueMap),我们会直接创建一个 HttpHeaders 来存储所有的 Header。

  • HttpHeaders 来存储所有的 Header。有了上面的解析,我们可以得出这样一个结论:要完整接收到所有的 Header,不能直接使用 Map 而应该使用 MultiValueMap。我们可以采用以下两种方式来修正这个问题:

    //方式 1
    @RequestHeader() MultiValueMap map
    //方式 2
    @RequestHeader() HttpHeaders map
    
  • 重新运行测试,你会发现结果符合预期:

    [myheader:“h1”, “h2”, host:“localhost:8080”, connection:“Keep-Alive”, user-agent:“Apache-HttpClient/4.5.12 (Java/11.0.6)”, accept-encoding:“gzip,deflate”]

  • 对比来说,方式 2 更值得推荐,因为它使用了大多数人常用的 Header 获取方法,例如获取 Content-Type 直接调用它的 getContentType() 即可,诸如此类,非常好用。

相关文章:

接受Header使用错Map类型,导致获取到的Header值不全

问题复现 在 Spring 中解析 Header 时&#xff0c;我们在多数场合中是直接按需解析的。例如&#xff0c;我们想使用一个名为 myHeaderName 的 Header&#xff0c;我们会书写代码如下&#xff1a;RequestMapping(path "/hi", method RequestMethod.GET) public Str…...

等保测评和密评的相关性和区别

等保测评和密评在网络安全领域均扮演着至关重要的角色&#xff0c;它们之间既存在相关性&#xff0c;又各具特色。 以下是对两者相关性和区别的详细阐述&#xff1a;相关性 1.法律基础&#xff1a;等保测评和密评都是依据国家相关法律法规开展的活动。 等保测评主要依据《网…...

朱姆沃尔特隐身战舰:从失败到威慑

前言 "朱姆沃尔特"号驱逐舰是美国海军雄心勃勃的项目&#xff0c;旨在重塑未来海战。它融合了隐身、自动化和强大火力&#xff0c;然而由于技术问题和预算超支&#xff0c;原计划建造32艘的目标被大幅缩减&#xff0c;最终只建造了三艘。该舰的设计特点包括“穿浪逆船…...

create-a-weather-app-using-flask-python

使用 Flask | Python 创建天气应用程序 原文:https://www . geesforgeks . org/create-a-weather-app-use-flask-python/ 先决条件: 烧瓶安装 Flask 是一个用 Python 编写的轻量级框架。它是轻量级的&#xff0c;因为它不需要特定的工具或库&#xff0c;并且允许快速的 web 开…...

BurpSuite2024.11

新增功能 2024 年 11 月 25 日&#xff0c;版本 24.11 此版本引入了站点地图过滤器 Bambdas、匹配和替换 Bambdas、用于 API 扫描的动态身份验证令牌&#xff0c;以及用于入侵者攻击的增强负载管理。我们还进行了多项用户体验改进、性能改进和一些错误修复。 使用 Bambdas 过…...

MyBatis-plus sql拦截器

因为业务需求&#xff0c;重新写了一套数据权限。项目中用的是mybtis-plus&#xff0c;正好MyBatis-Plus提供了插件数据权限插件 | MyBatis-Plus&#xff0c;那就根据文档来实现这个需求。 实现&#xff1a; 实现MultiDataPermissionHandler 首先创建MultiDataPermissionHan…...

springboot3 redis 批量删除特定的 key 或带有特定前缀的 key

在 Spring Boot 3 中与 Redis 一起使用时&#xff0c;可以通过 Redis 的命令来实现批量删除特定的 Key 或带有特定前缀的 Key。以下是实现方式和注意事项。 使用 RedisTemplate RedisTemplate 是 Spring Boot 提供的一个操作 Redis 的工具&#xff0c;支持各种 Redis 操作。 …...

若依框架(前后端分离)集成cas5.5

一、后端配置 1、添加cas依赖 在common模块pom添加spring-security-cas依赖&#xff1a; <!-- spring security cas--> <dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-cas</artifactId> &l…...

区块链方向学习路线

学习路线图 下面是登链社区给出的区块链开发者的学习路线图 学习路线建议 对于一个区块链方向的学习者而言&#xff0c;首先要了解的是区块链理论知识&#xff0c;当你了解了区块链的理论知识之后&#xff0c;下面有三个方向来学习&#xff0c;可以通俗的理解为区块链方向的后…...

【从零开始入门unity游戏开发之——C#篇40】C#特性(Attributes)和自定义特性

文章目录 前言一、特性&#xff08;Attributes&#xff09;基本概念二、自定义特性1、自定义特性代码示例&#xff1a;2、应用自定义特性&#xff1a;3、解释3.1 **AttributeUsage 特性**3.2 特性的命名3.3 **构造函数**&#xff1a;3.4 **属性**&#xff1a; 4、使用反射获取特…...

Unity2D无限地图的实现(简单好抄)

说明&#xff1a;本教程实现的是在2D游戏中玩家在游戏中上下左右移动的时候自动进行地图拼接的功能&#xff0c;如果你只想实现左右移动的无限地图&#xff0c;那么这篇博客也能起到一定参考作用。 思路 第一步&#xff1a; 创建一个10*10的2D游戏对象当做地图 第二步创建一个…...

OSPF特殊区域(open shortest path first LSA Type7)

一、区域介绍 1、Stub区域 Stub区域是一种可选的配置属性。通常来说&#xff0c;Stub区域位于自治系统的边界&#xff0c;例如&#xff0c;只有一 个ABR的非骨干区域。在这些区域中&#xff0c;设备的路由表规模以及路由信息传递的数量都会大量减少。 kill 4 5类type 传递1 …...

工程师了解的Lua语言

1、关于lua语言 lua语言是用于嵌入式领域当中的一门脚本语言&#xff0c;其实在大学期间&#xff0c;我也没有接触过这门语言&#xff0c;但是在未来的发展之路当中&#xff0c;需要用到这门语言&#xff0c;所以在我的知识库当中添加这门语言知识是必要而且重要的&#xff0c;…...

每日一学——日志管理工具(Graylog)

5.2 Graylog 5.2.1 输入输出配置 嘿&#xff0c;小伙伴们&#xff01;今天我们要介绍的是Graylog——一款功能强大的日志管理工具。Graylog不仅可以帮助我们收集、存储和搜索日志数据&#xff0c;还可以通过丰富的插件系统进行扩展。让我们一起来看看如何配置Graylog来收集日…...

SQL Server中最大并行度详解

在 SQL Server 中&#xff0c;MAXDOP&#xff08;Maximum Degree of Parallelism&#xff0c;最大并行度&#xff09;是一个用于控制并行查询执行中最大可用 CPU 核心数的配置参数。通过设置 MAXDOP&#xff0c;你可以管理 SQL Server 在执行并行查询时使用多少个处理器核心&am…...

2453.学习周刊-2024年53周

封面 不要站在问题一边打败孩子&#xff0c;而是站在孩子一边打败问题&#xff0c;多从孩子的角度思考问题&#xff0c;帮助孩子一起解决问题 ✍优秀博文 SQL中历史数据处理实践指南新领导上任了&#xff0c;老员工该如何适应&#xff1f;主动接纳还是我行我素&#xff1f; ✍…...

硬件-射频-PCB-常见天线分类-ESP32实例

文章目录 一&#xff1a;常见天线1.1 PCB天线①蓝牙模块的蛇形走线-天线②倒F天线-IFA&#xff1a;③蛇形倒F天线-MIFA④立体的倒F天线-PIFA 1.2 实例示意图1.21 对数周期天线(LPDA):1.22 2.4GHZ的八木天线&#xff1a;1.23 陶瓷天线&#xff1a;1.24 外接天线&#xff1a; 二&…...

Golang的容器编排实践

Golang的容器编排实践 一、Golang中的容器编排概述 作为一种高效的编程语言&#xff0c;其在容器编排领域也有着广泛的运用。容器编排是指利用自动化工具对容器化的应用进行部署、管理和扩展的过程&#xff0c;典型的容器编排工具包括Docker Swarm、Kubernetes等。在Golang中&a…...

关于大一上的总结

大一上总结 前言 源于学长们都喜欢写总结&#xff0c;今晚也正好听见一首有点触动心灵的歌&#xff0c;深有感慨&#xff0c;故来此写下这篇总结 正文 1.暑假前的准备 暑假之前姑且还是学习了基本的C语法&#xff0c;大概是到了结构体的地方&#xff0c;进度很慢&#xff0…...

SpringBoot教程(三十二) SpringBoot集成Skywalking链路跟踪

SpringBoot教程&#xff08;三十二&#xff09; | SpringBoot集成Skywalking链路跟踪 一、Skywalking是什么&#xff1f;二、Skywalking与JDK版本的对应关系三、Skywalking下载四、Skywalking 数据存储五、Skywalking 的启动六、部署探针 前提&#xff1a; Agents 8.9.0 放入 …...

iOS 11 中的 HEIF 图像格式 - 您需要了解的内容

HEIF&#xff0c;也称为高效图像格式&#xff0c;是iOS 11 之后发布的新图像格式&#xff0c;以能够在不压缩图像质量的情况下以较小尺寸保存照片而闻名。换句话说&#xff0c;HEIF 图像格式可以具有相同或更好的照片质量&#xff0c;同时比 JPEG、PNG、GIF、TIFF 占用更少的设…...

Python爬虫入门(1)

在互联网时代&#xff0c;数据成为了最宝贵的资源之一。Python作为一种功能强大的编程语言&#xff0c;因其简洁的语法和丰富的库支持&#xff0c;成为了编写网络爬虫的首选。本文将带你入门Python爬虫技术&#xff0c;让你能够从互联网上自动获取数据。 什么是爬虫&#xff1…...

GIT 企业级开发学习 1

本节主要命令&#xff1a; git init ls 不能列出 .git ls -a 列出 .git 1. 初始化 Git 仓库 git init • 初始化一个新的 Git 仓库&#xff0c;在当前目录下生成一个 .git 隐藏文件夹&#xff0c;用于存储版本控制信息。 2. 查看隐藏文件 ls -a • 使用 ls -a 显示隐藏文件…...

C# _ 数字分隔符的使用

总目录 一、数字分隔符是什么&#xff1f; _ 用作数字分隔符。可以将数字分隔符用于所有类型&#xff08;二进制&#xff0c;十进制&#xff0c;十六进制&#xff09;的数字文本。数字分隔符 _ 在编译时是被编译器忽略的&#xff0c;因此在语义上对数字结果没有任何影响。 二…...

迟来的前端面试经验

最近也是在换工作&#xff0c;小公司和大厂&#xff08;虾皮、腾讯&#xff09;都有面试。几次面试收获还是比较大的&#xff0c;了解许多自己的短板&#xff0c;当然也拿到了合适的offer。本文主要整理下面试遇到的问题和知识点&#xff0c;希望对准备找工作的掘友有所帮助。 …...

深度解析 LDA 与聚类结合的文本主题分析实战

🌟作者简介:热爱数据分析,学习Python、Stata、SPSS等统计语言的小高同学~🍊个人主页:小高要坚强的博客🍓当前专栏:《Python之文本分析》🍎本文内容:深度解析 LDA 与聚类结合的文本主题分析实战🌸作者“三要”格言:要坚强、要努力、要学习 目录 引言 技术框架…...

国内Ubuntu环境Docker部署CosyVoice

国内Ubuntu环境Docker部署CosyVoice 本文旨在记录在 国内 CosyVoice项目在 Ubuntu 环境下如何使用 dockermin-conda进行一键部署。 源项目地址&#xff1a; https://github.com/FunAudioLLM/CosyVoice 如果想要使用 dockerpython 进行部署&#xff0c;可以参考我另一篇博客中的…...

Oracle sql developer and Toad for Oracle set start DBMS output

Oracle sql developer Toad for Oracle...

ArcGIS JSAPI 高级教程 - 通过RenderNode实现视频融合效果(不借助三方工具)

ArcGIS JSAPI 高级教程 - 通过RenderNode实现视频融合效果(不借助三方工具) 核心代码完整代码在线示例地球中展示视频可以通过替换纹理的方式实现,但是随着摄像头和无人机的流行,需要视频和场景深度融合,简单的实现方式则不能满足需求。 三维视频融合技术将视频资源与三维…...

关于IDE的相关知识之二【插件推荐】

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///计算机爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于ide插件推荐的相关内容&#xff01…...

Spring Boot日志处理

文章目录 Spring Boot日志处理1. 日志存入数据库&#xff08;AOP&#xff09;2. 日志控制台打印与写入文件&#xff08;logback&#xff09; Spring Boot日志处理 1. 日志存入数据库&#xff08;AOP&#xff09; 引入aop依赖 <dependency><groupId>org.springfram…...

node.js之---子线程(child_process)模块

为什么需要子线程&#xff08;child_process&#xff09;模块 Worker Threads 的基本概念 如何使用 Worker Threads Worker Threads 的性能 Worker 线程的优势和限制 进阶用法&#xff1a;共享内存 为什么需要子线程&#xff08;child_process&#xff09;模块 在 Node.js…...

什么是打流,怎么用iperf3打流

什么是打流 在网络安全和黑灰产领域&#xff0c;“打流”具有不同的含义&#xff0c;常用于形容通过技术手段制造流量假象或发起流量攻击。 流量攻击&#xff08;DDoS&#xff09;中的“打流”&#xff1a; “打流”指向目标服务器或网络发起 大规模的数据请求&#xff0c;造…...

Java 可变参数、Collections工具类

一. 可变参数 1. 可变参数&#xff1a;就是一种特殊形参&#xff0c;定义方法、构造器的形参列表里&#xff0c;格式&#xff1a;数据类型...参数名称 2. 特点&#xff1a;可以不传数据&#xff1b;可以穿一个或多个数据&#xff1b;也可以传一个数组 3. 好处&#xff1a;常常用…...

day30-awk进阶

awk模式种类 awk的模式分为这几种 正则表达式 基本正则扩展正则比较表达式范围表达式特殊模式 BEGINEND awk比较运算符&#xff08;语法&#xff09; 关系运算符解释示例<小于x<y<小于等于x<y等于xy!不等于x!y>大于等于x>y>大于x>y~匹配正则x~/正则…...

cka考试-03-k8s版本升级

一、原题 二、解答 [root@master ~]# kubectl get node NAME STATUS ROLES AGE VERSION master Ready control-plane,master 25h v1.22.12 node1 Ready worker 25h v1.22.12 node2 Ready worker …...

前后端分离项目部署到云服务器、宝塔(前端vue、后端springboot)详细教程

一、部署介绍 部署的环境是宝塔&#xff08;宝塔9.0.0&#xff09;、阿里云服务器&#xff08;centos 7.6&#xff09;&#xff1b;前端是Vue3项目、后端是springboot3x、jdk11、数据库有redis、mysql&#xff1b;搜索采用的是es。 由于宝塔面板中可以快速进行环境的配置&…...

vue面试题|[2025-1-3]

1.v-if和v-show的区别&#xff1f; 都是可以控制元素的显示和隐藏 1.v-show是控制元素的display值来让元素显示和隐藏&#xff1b;v-if显示&#xff08;隐藏&#xff09;时会把整个DOM元素添加&#xff08;删除&#xff09; 2.v-show只是简单的css切换&#xff1b;v-if有一个局…...

微信小程序中的 storage(本地存储)和内存是两个完全不同的存储区域

这是一个非常关键且容易混淆的概念 既然 this.globalData.appId appId 是将 appId 存储在内存中&#xff0c;为什么微信小程序中的 wx.getStorage 和 wx.setStorage&#xff08;本地存储&#xff09;中没有 appId&#xff0c;并且您提出了一个非常重要的疑问&#xff1a;stor…...

时序优化方法

1.rtl级 1.1避免组合逻辑级数过深 当组合逻辑级数过深时&#xff0c;如果时序允许&#xff0c;可以通过插入时序逻辑来打断组合逻辑链。 1.2寄存器复制 如果是由于fanout过大&#xff0c;可以通过寄存器复制&#xff0c;来减小扇出。 1.3逻辑展平&#xff0c;消除优先级 …...

网络游戏之害

网络游戏之害&#xff1a; 网络游戏于今之世风靡四方&#xff0c;其娱人耳目、畅人心怀之效&#xff0c;固为人知&#xff0c;然所藏之害&#xff0c;若隐伏之暗潮&#xff0c;汹涌而至时&#xff0c;足以覆舟&#xff0c;尤以青年为甚&#xff0c;今且缕析其害&#xff0c;以…...

被催更了,2025元旦源码继续免费送

“时间从来不会停下&#xff0c;它只会匆匆流逝。抓住每一刻&#xff0c;我们才不会辜负自己。” 联系作者免费领&#x1f496;源&#x1f496;码。 三联支持&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4dd;欢迎留言讨论 更多内容敬请期待。如有需要源码可以联系作者免…...

Springboot - Web

Spring Boot 是一个用于简化 Spring 应用程序配置和部署的框架。它提供了一种快速开发的方式&#xff0c;通过默认配置、自动化配置等特性&#xff0c;使得开发者能够更快捷地构建和部署基于 Spring 的应用。 Spring Boot Web 是 Spring Boot 的一个子模块&#xff0c;它专注于…...

Flutter中的网络请求图片存储为缓存,与定制删除本地缓存

Flutter中的网络请求图片存储为缓存&#xff0c;与定制删除本地缓存 1&#xff1a;封装请求图片函数 2&#xff1a;访问的图片都会转为本地缓存&#xff0c;当相同的请求url&#xff0c;会在本地调用图片 3&#xff1a;本地缓存管理【windows与andriod已经测试】【有页面】【有…...

智汇厦门:苏哒智能携其智能化产品亮相文心中国行现场

2025年1月2日&#xff0c;文心中国行再次踏足美丽的鹭岛厦门。 本次的文心中国行活动不仅有来自政府、高校及企业的精英专家将齐聚一堂&#xff0c;分享AI与大模型的最新研究成果&#xff0c;还正式揭牌百度飞桨&#xff08;厦门&#xff09;人工智能产业赋能中心&#xff0c;…...

SQL 分析函数与聚合函数的组合应用

目标&#xff1a;掌握 SQL 中分析函数&#xff08;窗口函数&#xff09;与聚合函数的组合使用&#xff0c;通过实际案例实现复杂业务需求&#xff0c;如同比、环比和趋势分析。 1. 分析函数与聚合函数的区别 聚合函数&#xff08;Aggregate Functions&#xff09;&#xff1a;…...

【Elasticsearch入门到落地】5、安装IK分词器

接上篇《4、Elasticsearch的安装》 上一篇我们进行了Elasticsearch以及Kibana的环境准备及软件安装&#xff0c;本篇我们安装最后一个支持软件IK分词器。 一、IK分词器概念 我们再来回顾一下上一张IK分词器的概念&#xff1a; IK分词器&#xff08;IK Analyzer&#xff09;是…...

8、RAG论文笔记(Retrieval-Augmented Generation检索增强生成)

RAG论文笔记 1、 **研究背景与动机**2、方法概述3、RAG 模型架构3.1总体架构3.2 Generator&#xff08;生成器&#xff09;3.3 检索器&#xff08;Retriever&#xff09;3.4训练&#xff08;Training&#xff09;3.5**解码方法**&#xff08;求近似 &#xff09;3.6微调的参数 …...

【论文笔记】Contrastive Learning for Sign Language Recognition and Translation

&#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&#xff0c;为生民立命&#xff0c;为往圣继绝学&#xff0c;为万世开太平。 基本信息 标题: Contrastive Learning for…...

《C++设计模式》策略模式

文章目录 1、引言1.1 什么是策略模式1.2 策略模式的应用场景1.3 本文结构概览 2、策略模式的基本概念2.1 定义与结构2.2 核心角色解析2.2.1 策略接口&#xff08;Strategy&#xff09;2.2.2 具体策略实现&#xff08;ConcreteStrategy&#xff09;2.2.3 上下文&#xff08;Cont…...