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

计算机网络——HTTP协议

1. HTTP的概述

        HTTP(超文本传输协议),定义在RFC2616中,是用于分布式和协作式多媒体系统之间交互的应用层通信协议。

1.1 无状态

        HTTP是一个无状态协议,意味着它不保存先前交互的记录。每个请求都独立于其他请求处理。

1.2 分布式和协作式多媒体系统间的交互

        HTTP旨在促进客户端和服务器在分布式系统中的互动,包括传输多媒体数据和在线协作。

1.3 HTTP的客户端/服务器模型

        客户端(通常是网络浏览器)向服务器(托管网站或应用程序的服务器)发送请求。然后服务器处理这个请求,并向客户端发送回应。

1.4 请求-响应连接

        客户端和服务器之间建立连接,以传输请求和响应。这可能是持久连接(为多个请求-响应保持开放)或非持久连接(每对请求-响应新建连接)。

1.5 HTTP消息:HTTP通信以消息的形式进行

        主要有两种类型的HTTP消息:请求和响应。

        请求通常由客户端发出,用于请求服务器上的特定资源,而响应则由服务器返回,以提供所请求的资源。

1.6 可靠的传输或会话协议

        HTTP依赖于可靠的传输协议,如TCP(传输控制协议),以确保传输的数据可靠。TCP确保数据按正确的顺序到达目的地,并且没有损坏。

1.7 GET请求

        大多数HTTP通信涉及到GET请求。GET请求用于请求服务器上特定资源的表示。例如,当您在浏览器中输入URL时,通常会向Web服务器发送一个GET请求,以获取相应的网页。

1.8 双向连接

        HTTP基于客户端-服务器通信模型,其中客户端发送请求到服务器,服务器则以响应方式回应。客户端和服务器之间的连接通常在通信期间保持打开,这允许双向交互,例如实时数据流传输。

        HTTP/1.1和之前的版本通常为每个请求/响应使用单独的TCP连接,这可能在某些情况下会导致延迟过高。

        HTTP/2和HTTP/3引入了改进,通过使用单个双向连接来处理多个请求和响应,以优化性能。

        总之,HTTP是Web的重要协议,允许Web浏览器可靠地向Web服务器请求资源,并提供保持双向连接以进行持续交互的能力。

2. HTTP协议的中介

        客户端、服务器和中介都可能具有缓存能力。图中展示了这些实体之间请求和响应的流程。

2.1 HTTP中介

        在HTTP通信中,“中介”(Intermédiaire)可以理解为在客户端和服务器之间传递信息的任何实体

        建立了一个连接链。

        HTTP的选项可以应用到最接近的中介上(隧道除外)。

        最终接收者。

        所有的中介。

        网络中的一个中介(比如代理、网关或隧道)可以介于客户端和服务器之间。

2.2 代理(Proxy)

        它像是一个中转站,客户端发送的请求会先到达代理,代理有可能会修改这个请求,然后再发送给真正的服务器。

2.3 网关(Passerelle)

        如果客户端和服务器之间的通信协议不同,网关会将客户端的请求翻译成服务器能理解的协议。

2.4 隧道(Tunnel)        

        隧道更像是一个直通管道,它不会修改经过的信息。当需要通过某些特殊的中介(比如防火墙)时,就会用到隧道。

2.5 缓存

        客户端、服务器和中介可能都设有缓存,以提高数据传输效率和减少延迟。

2.6 数据流

        客户端发送请求到服务器,以及服务器响应返回给客户端的过程,中间可能通过一个中介来完成数据传输。

        简单来说,这些描述指出在HTTP协议中,信息可以通过一个或多个中介(如代理服务器、网关等)来传递。每个中介都可以根据HTTP协议的选项进行操作,但是隧道类型的中介是个例外,它通常只是简单地传递信息而不做修改。最终,信息会到达最终的接收者,也就是目标服务器。在这个过程中,每个中介都可能会对信息流产生影响。

3. HTTP协议中的两种链接

3.1 非持久连接

        对于每个请求的URI(统一资源标识符),都会建立一个单独的连接。这种方式可能会导致服务器负载过重,互联网拥堵。在HTTP1.1之前的版本中,默认的连接是非持久的,有时候甚至不支持持久连接。

3.2 持久连接

        通过一次连接,可以发送多个请求并接收多个响应,不需要每次都重新建立连接。这减少了开启和关闭连接的频繁操作,提高了效率。

3.2.1 管道化(Pipeline)

        在HTTP1.1中,客户端可以同时发送多个请求,而不用等待对前一个请求的响应。服务器按照请求接收的顺序发送回响应。这进一步提高了传输效率。

3.2.2 持久性

        如果服务器关闭了连接,客户端应该准备好重新发起请求。这意味着客户端在连接被关闭时能够恢复通信,而不会丢失请求。

        简而言之,HTTP的持久连接和管道化技术都是为了让网页加载更快、更高效,减少因频繁建立连接造成的延迟和资源消耗。

4. HTTP消息结构——HTTP消息的基本组成部分

        两种类型的消息:请求(requête)和响应(réponse)

        消息结构:一个消息包含四个部分

4.1 起始行(start-line)

4.1.1 基本概念

        HTTP消息的第一行非常重要,因为它定义了消息是一个请求还是一个响应:

        对于请求来说,包括了方法(GET、POST等)、请求的URI和HTTP版本。

        对于响应来说,包括了HTTP版本、状态码和状态消息。

4.1.2 具体解释

        起始行(start-line):这一行指定了消息的类型。它可以是请求行(Request-Line)或状态行(Status-Line)。

        如果是请求行,它会包含三个部分:

4.1.2.1 方法(Method)        

        这指的是HTTP请求的类型,例如GET(获取数据)、POST(发送数据)等。

        HTTP协议中不同方法的说明:

        GET:用于请求访问由URI(统一资源标识符)所标识的资源。

        HEAD:类似于GET方法,但是服务器在响应中只返回头部信息,不返回实际的资源内容。

        POST:用于向指定的资源提交数据,例如,提交表单或上传文件。数据包含在请求体中。

        PUT:用于上传指定的资源。如果URI指向的资源不存在,服务器可以创建这个资源。

        DELETE:请求服务器删除指定的URI所标识的资源。

        TRACE:回显服务器收到的请求,主要用于测试或诊断。

        CONNECT:将连接转换为透明的TCP/IP隧道,通常用于SSL加密服务器的连接(通过HTTP代理)。

        OPTIONS:用于描述通信选项的测试方法,用于了解服务器或其他网络组件的能力。

        这些方法定义了客户端与服务器之间交互的不同方式,使得HTTP协议能够支持多种不同的网络操作。

4.1.2.2 请求目标(request-target)

        通常是你要请求的网址,即统一资源标识符(URI)。

4.1.2.3 协议版本(HTTP-Version)

        表明使用的HTTP协议的版本,如HTTP/1.1。

        每部分之间通常用空格分开,并且以CRLF(回车换行)符号结束这一行。所以,如果是一个请求,起始行会告诉服务器你想要做什么(方法),你想在哪里做(请求目标),以及你打算使用哪个版本的HTTP协议来通信。

4.2.头部(message-header)

4.2.1 基本定义

        跟随起始行,包含了键值对形式的元数据,如内容类型、内容长度、缓存控制等。

        HTTP头部:它由一个名字和一个值组成,这些都是用ASCII码编码的。

        一个消息头的格式是这样的:field-name: field-value

        举例来说,Content-Type: text/html就是一个消息头,其中Content-Type是字段名,text/html是字段值。

4.2.2 头部类型

        HTTP头部可以是通用头部,也可以是请求或响应特有的头部,或者是与消息体中所含实体相关的头部。

4.2.2.1 通用头部(General header)

        是指那些请求和响应消息都可能使用的头部,比如`Date`或者`Cache-Control`

        通用头部:这些头部与整个消息有关,而不是仅与消息的内容(即消息体)有关。

        用途:通用头部用于控制消息的处理过程,这个处理过程可能涉及客户端、服务器或中间件。它们也可以提供一些额外的信息。

        特性:通用头部不特定于任何一个请求、响应或消息体中的实体。

        通用头部的例子包括:

        Cache-Control:指示缓存行为。

        Connection:指示是否持久连接。连接选项,不会通过代理传递。例如:`Connection: close`,表示关闭连接,不使用持久连接。

        Date:消息创建的日期和时间。消息生成的日期。示例为`Date: Tue, 15 Nov 1994 08:12:31 GMT`,表示消息是在1994年11月15日格林尼治时间上午8点12分31秒生成的。

        Transfer-Encoding:传输消息体时使用的编码类型。

        no-cache:指示缓存必须向服务器验证响应的有效性。

        no-store:指示请求或响应不能被缓存。

        这些头部用于控制HTTP消息如何被发送、接收和处理,它们对于管理网络连接和缓存行为非常重要。        

4.2.2.2 请求头部(Request header)

        是指那些只在请求消息中使用的头部,比如User-Agent或Accept。

        请求头部的一些例子:

        Accept:客户端能够接收的媒体类型。示例`Accept: audio/*; q=0.2, audio/basic`表示客户端优先接收基本的音频类型,但也可以接受其他类型的音频内容,尽管它们的优先级较低(q=0.2)。

        Accept-Charset:客户端支持的字符集。示例`Accept-Charset: iso-8859-5, unicode-1-1;q=0.8`表示客户端优先接受ISO-8859-5编码的字符集,但也可以接受Unicode-1-1,尽管其优先级稍低(q=0.8)。

        Accept-Encoding:客户端支持的内容编码。示例`Accept-Encoding: 表示客户端接受任何类型的内容编码。

        Accept-Language:客户端优先接受的语言。示例`Accept-Language: en-gb;q=0.8, en;q=0.7`表示客户端优先接受英国英语,其次是其他类型的英语。

        Accept-Ranges:服务器可以接受的部分请求的单位。示例`Accept-Ranges: bytes`表示服务器可以处理以字节为单位的部分请求。

        Allow:服务器支持的HTTP方法。示例`Allow: GET, HEAD, PUT`表示服务器支持GET、HEAD和PUT这三种请求方法。

        If-Modified-Since:告诉服务器如果请求的资源自指定的日期之后被修改过,就发送资源。示例`If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT`表示如果自1994年10月29日19点43分31秒GMT之后资源有变更,就发送该资源;否则,返回304状态码,表示资源未修改。

        这些请求头部使得HTTP请求可以更精确地告诉服务器客户端的具体需求和支持的特性,以便服务器可以发送符合客户端要求的响应。

4.2.2.3 响应头部(Response header)

        是指只在响应消息中使用的头部,比如Server或WWW-Authenticate。

        HTTP响应头部的一些例子:

        Accept-Ranges:定义服务器是否接受范围请求,以及定义的范围类型。示例`Accept-Ranges: none`表明服务器不支持范围请求。

        Age:表示自从响应产生以来经过的时间(以秒为单位)。示例`Age: 3000`表明该响应已经产生了3000秒。

        Location:用于重定向到一个新的URI。示例`Location: http://www.cnam.fr`表示客户端应跳转到提供的URI。

        Etag:响应内容的唯一标识(实体标签)。它可以用来检查资源是否有变化。示例`ETag: "nom"`提供了一个值,客户端可以在后续的请求中使用这个值来检查资源是否被修改。

        这些响应头部帮助客户端理解服务器的响应并适当地处理它们,例如判断内容是否最新、是否需要重定向到新的地址,或者验证缓存的内容是否仍然是最新的。

4.2.2.4 实体头部(Entity header)

        是指那些和消息体的内容相关的头部,比如`Content-Length`或`Content-Type`。

        当然,这里有一个HTTP请求的头部示例:

        假设您的浏览器向`www.example.com`的服务器发送一个请求来获取首页的HTML文档,HTTP请求可能包含以下头部:

        GET /index.html HTTP/1.1是请求行,指明使用GET方法获取`/index.html`这个资源,使用的是HTTP 1.1版本。

        Host: www.example.com 是一个请求头部,指定请求的服务器地址。

        User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3是一个请求头部,描述了发出请求的浏览器的类型和版本。

        Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 是一个请求头部,告诉服务器客户端能够处理的内容类型。

        Accept-Language: en-US,en;q=0.5是一个请求头部,说明客户端优先接受的语言。

        Accept-Encoding: gzip, deflate 是一个请求头部,说明客户端可以接受的内容编码类型,比如gzip压缩。

        Connection: keep-alive:是一个请求头部,要求服务器保持连接打开,以便后续请求复用通过这些头部,HTTP消息可以携带关于请求或响应的附加信息,以及关于实体本身的数据。

4.3 空行(CRLF,即Carriage Return Line Feed)

        标记头部结束和消息体开始的地方。

4.4 消息体(message-body)

        可选部分,包含了发送的数据,比如网页的HTML代码或API调用的JSON数据。

        消息体编码:HTTP消息的主体部分在传输时会进行编码,这种编码方式会在HTTP头部中指定。消息体可以包含任意的数据字节(在文本中表示为`OCTET`)。

        实体(entité):传输在消息体中的资源被称为实体。实体可以是文档、图片或其他任何类型的数据。

        简而言之,HTTP消息体是HTTP消息结构的一个组成部分,它承载了客户端请求或服务器响应中的实际内容。比如,当你请求一个网页时,该网页的HTML内容就会作为响应的消息体发送给你。消息体的具体内容和格式由HTTP头部中的`Content-Type`和`Content-Encoding`等字段指定。

4.5 理解

        HTTP消息就像是互联网上的信封,里面装着网页或应用程序发送和接收的信息。这个“信封”有固定的格式,分为几个部分:

        起始行:就像信封的标题,告诉我们这是什么类型的信息。如果是请求,会包含你想要做的事情(比如查看网页),如果是响应,会告诉你请求结果如何(比如请求成功或失败)。

        头部:提供额外信息,比如内容有多长,需要用什么方式查看等。

        空行:头部结束的标志,就像写信时在正文前空一行一样。

        消息体:这是可选的,如果你发送的是网页内容或者是其他数据,就会用到这一部分。

        总的来说,HTTP消息就是互联网上发送和接收数据的方式,它有固定的格式,确保数据能够正确地发送和接收。

        通常,一个HTTP消息从起始行开始,然后是多个头部,一个空行,最后是消息体(如果有的话)。这种结构使得HTTP消息既可以携带请求的详细信息,也可以携带服务器的响应数据。

5. HTTP协议和统一资源标识符(URI)的使用

5.1 目标资源

        在HTTP请求中,客户端指定想要交互的目标资源,这个资源通过URI来识别。

5.1.1 绝对形式

        客户端在请求行中使用完整的URI来指定资源。例如:

 GET http://www.ietf.org/rfc/rfc2616.txt HTTP/1.1

        这里GET是请求方法,http://www.ietf.org/rfc/rfc2616.txt是资源的绝对URI,HTTP/1.1是HTTP协议的版本。

5.1.2 相对形式

        客户端可以在请求行中使用相对URI,并在请求头部使用`Host`字段来指定主机名。例如:

GET /rfc/rfc2616.txt HTTP/1.1Host: www.ietf.org

        在这种情况下,请求行只包含资源的相对路径(`/rfc/rfc2616.txt`),而`Host`头部指定了完整的主机名(`www.ietf.org`)。

        绝对形式的URI在请求中提供了资源的完整地址,而相对形式则需要结合`Host`头部字段来确定资源的完整位置。这两种形式都是HTTP/1.1标准中支持的。

5.2 HTTP请求和响应的格式

5.2.1 请求

5.2.1.1 格式

        由请求行(Request-Line)开始,这是HTTP请求的第一行,包含了方法、请求的资源URI和HTTP版本。

        紧接着是零个或多个头部字段(header-field),每个字段都以回车换行符(CRLF)结束。

        头部字段和消息体之间有一个空的回车换行符(CRLF)作为分隔。

        可选的消息体(message-body),用于包含如POST请求的数据。

5.2.1.2 示例
GET /path/file.html HTTP/1.0From: someuser@jmarshall.comUser-Agent: HTTPTool/1.0[blank line here]

        请求行:使用GET方法请求/path/file.html这个资源,HTTP版本为1.0。

        From头部:发起请求的用户的电子邮件地址是someuser@jmarshall.com。

        User-Agent头部:发起请求的客户端程序是HTTPTool/1.0。

        请求头部与消息体之间有一个空白行,表示消息头部结束,如果有消息体的话会在这个空白行后面开始

5.2.2 响应

5.2.2.1 格式

        由状态行(Status-Line)开始,这是HTTP响应的第一行,包含了HTTP版本、状态码和状态描述。

        同样地,紧接着是零个或多个头部字段(header-field),每个字段都以回车换行符(CRLF)结束。

        头部字段和消息体之间有一个空的回车换行符(CRLF)作为分隔。

        可选的消息体(message-body),用于包含如返回的网页内容或API调用的JSON数据。

5.2.2.2 示例
HTTP/1.0 200 OKDate: Fri, 31 Dec 1999 23:59:59 GMTContent-Type: text/htmlContent-Length: 1354<html> <body> ...</body> </html>

        状态行:HTTP版本为1.0,状态码为200,表示请求成功。

        Date头部:响应生成的日期和时间是1999年12月31日23时59分59秒 GMT。

        Content-Type头部:响应的内容类型是text/html,表示是一个HTML文档。

        Content-Length头部:响应的内容长度是1354字节。

        消息体:包含HTML文档的实际内容,从<html>开始,到</html>结束。

        这个格式允许HTTP消息在网络上清晰地传输请求和响应信息,确保接收方可以正确解析消息的各个部分。

5.2.2.2.1 HTTP版本(HTTP-Version)

        指明了响应遵循的HTTP协议版本,例如HTTP/1.1或HTTP/2.0。

5.2.2.2.2 状态码(Status-Code)

        是一个三位整数,用于表示请求的处理结果。例如,200表示请求成功,404表示没有找到请求的资源。

HTTP响应状态码的分类:

        1xx(信息响应):表示接收到请求并且继续处理中。

        2xx(成功):表示请求已被成功接收、理解并接受。

        3xx(重定向):表示需要进一步的操作以完成请求,通常用来进行URL的重定向。

        4xx(客户端错误):表示请求包含语法错误或无法完成请求。

        5xx(服务器错误):表示服务器在尝试处理请求时发生了错误。

        每个数字范围代表一个响应类型,其中首位数字定义了响应的类别,其后两位数字无分类作用,但指定了具体的响应条件或错误。这个系统允许客户端理解它们的请求是否成功,并在出错时了解问题所在。

        100 Continue:继续。客户端应继续其请求。

        101 Switching Protocols:切换协议。服务器根据客户端的请求切换协议。

        200 OK:请求成功。一般用于GET与POST请求。

        201 Created:已创建。成功请求并创建了新的资源。

        202 Accepted:已接受。已经接受请求,但未处理完成。

        203 Non-Authoritative Information:非权威信息。请求成功,但返回的信息可能来自第三方。

        204 No Content:无内容。服务器成功处理,但未返回内容。

        301 Moved Permanently:永久移动。请求的资源已永久移动到新位置。

        307 Temporary Redirect:临时重定向。请求的资源临时从其他地址响应。

        400 Bad Request:错误请求。服务器无法理解请求的格式。

        500 Internal Server Error:内部服务器错误。服务器遇到错误,无法完成请求。

        这些状态码是客户端与服务器通信时,用于表示请求处理情况和结果的重要信息

        原因短语(Reason-Phrase):是一个对状态码的简短文字描述,例如"OK"表示成功,"Not Found"表示资源未找到。

        回车换行符(CRLF):状态行的结束标志,确保与后续头部的分隔。

        例如,一个典型的状态行可能是:

`        HTTP/1.1 200 OK,其中`HTTP/1.1`是协议版本,`200`是状态码,`OK`是原因短语,表示请求已经成功处理。

6. HTTP协议的总结

        请求-响应简单协议:HTTP是一个基于TCP(传输控制协议)的简单请求-响应类型的协议,它是无状态的,意味着服务器不会保持与客户端之间的交互状态。

        Cookies:Cookies是一种在客户端存储状态信息的简单方式,用于跨越多个请求维持交互状态。

        信息传输载体:HTTP可以用来传输任何类型的信息。

        认证机制:HTTP支持基本的认证方案,如用户名和密码登录,也支持更安全的摘要认证和加密,比如使用SSL(安全套接层)。

        代理作为中间人:在HTTP通信中,代理服务器(Proxy)充当客户端和服务器之间的中间人,可以处理和转发请求和响应。

        规范参考:HTTP协议的规范由W3C(万维网联盟)维护,参考地址是:[http://www.w3.org/Protocols/Specs.html](http://www.w3.org/Protocols/Specs.html)。

        这段总结指出了HTTP协议的基本特征和一些关键的技术点,以及它如何适用于Web通信和数据传输。

相关文章:

计算机网络——HTTP协议

1. HTTP的概述 HTTP&#xff08;超文本传输协议&#xff09;&#xff0c;定义在RFC2616中&#xff0c;是用于分布式和协作式多媒体系统之间交互的应用层通信协议。 1.1 无状态 HTTP是一个无状态协议&#xff0c;意味着它不保存先前交互的记录。每个请求都独立于其他请求处理。…...

QT上位机开发(利用tcp/ip访问plc)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 plc是工控领域很重要的一个器件。简单的plc一般就是对io进行控制&#xff0c;但是复杂的plc&#xff0c;还可以控制电机、变频器&#xff0c;在工业…...

MySQL-多表连接查询

&#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克&#x1f379; ✨博客主页&#xff1a;小小恶斯法克的博客 &#x1f388;该系列文章专栏&#xff1a;重拾MySQL &#x1f379;文章作者技术和水平很有限&#xff0c;如果文中出现错误&am…...

Qt第二周周二作业

代码&#xff1a; widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);~Widget();void paintEvent(…...

docker 学习命令整理

文章目录 docker 学习命令整理(积累中...)0. 启动/停止1. 运行2. 查看运行中docker3. 删除指定container4. 查看本地镜像5. 拉取指定镜像6. 新起终端进入同一container7. 取消sudo8. 查看docker状态9. 查看docker存储10.删除镜像11.删除容器12. qemu12.1 安装12.2 卸载qemu 附&…...

windows安装RabbitMq,修改数据保存位置

1、先安装Erlang&#xff0c; Erlang和RabbitMQ有版本对应关系。 官网RabbitMQ与Erlang版本对应RabbitMQ Erlang Version Requirements — RabbitMQ 2、安装RabbitMQ。 3、修改数据保存地址。找到安装目录下的sbin文件夹&#xff0c;找到rabbitmq-env.bat&#xff0c;编辑文件…...

Redis面试题18

Redis 支持集群模式吗&#xff1f;如何实现 Redis 的集群&#xff1f; 答&#xff1a;是的&#xff0c;Redis 支持集群模式&#xff0c;并提供了 Redis Cluster 来实现分布式数据存储和高可用性。 Redis Cluster 是通过将数据分散到多个节点上来实现的&#xff0c;每个节点都拥…...

python实现文件批量分发

在Python中实现文件的批量分发通常涉及到文件的读取、网络通信以及目标系统上的文件写入。这里有几种方法来实现这一功能,但最常见的方法之一是使用FTP(文件传输协议)或SSH(安全外壳协议)。以下是使用Python通过SSH进行文件批量分发的一个基本示例。这里使用了paramiko库,…...

分销商城多端uniapp 可编译5端 - 等级提现额度

等级提现额度 等级提现额度是一种常见的财务管理策略&#xff0c;通常用于在线平台、金融服务或游戏中&#xff0c;用于控制不同等级用户的提现限额。这样的机制有助于平台管理资金流动性&#xff0c;防范欺诈&#xff0c;并鼓励用户提升他们的活跃度或忠诚度。以下是一个简单的…...

蓝桥杯基础知识5 unique()

蓝桥杯基础知识5 unique&#xff08;&#xff09; #include <bits/stdc.h>int main(){std::vector<int> vec {1,1,2,2,3,3,3,4,4,5};auto it std::unique(vec.begin(), vec.end());vec.erase(it, vec.end());//vec.erase(unique(vec.begin(),vec.end()),vec.end(…...

设计一个抽奖系统

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring原理、JUC原理、Kafka原理、分布式技术原理、数据库技术&#x1f525;如果感觉博主的文章还不错的…...

IntelliJ IDEA使用学习

一、安装教程 网上自行下载&#xff0c;CSDN不然过审二、使用教程 2.1 快捷键操作与设置 设置 Setting——>按键映射——>选择顺手的系统快捷键 编写代码 CtrlShift Enter&#xff0c;语句完成。 “&#xff01;”&#xff0c;否定完成&#xff0c;输入表达式时按 …...

sqlilabs第五十三五十四关

Less-53(GET - GET - Error based - ORDER BY CLAUSE-String- Stacked injection) 手工注入 单引号闭合&#xff0c;和上一关一样堆叠注入解决 自动注入 和上一关一样 Less-54(GET - challenge - Union- 10 queries allowed -Variation 1) 手工注入 这一关开始后面的可以看…...

❤ Uniapp使用三( 打包和发布上线)

❤ Uniapp使用三( 打包和发布上线) 一、介绍 什么是 uniapp&#xff1f; uniapp 是一种基于 Vue.js 的多平台开发框架&#xff0c;它可以同时用于开发安卓、iOS、H5 等多个平台。因此&#xff0c;只需要写一次代码就可以在多个平台上运行&#xff0c;提高了开发效率。 打包…...

【JavaEEj进阶】 Spring实现留言板

文章目录 &#x1f38d;预期结果&#x1f340;前端代码&#x1f384;约定前后端交互接⼝&#x1f6a9;需求分析&#x1f6a9;接⼝定义 &#x1f333;实现服务器端代码&#x1f6a9;lombok &#x1f332;服务器代码实现&#x1f334;运⾏测试 &#x1f38d;预期结果 可以发布并…...

react、Vue打包直接运行index.html不空白方法

react vue 在根目录下创建 vue.config.js 文件&#xff0c;写入 module.exports {publicPath: ./, }...

SpringBoot-01

Spring Boot是一个开源的Java框架&#xff0c;用于快速构建独立的、可执行的、生产级的Spring应用程序。它基于Spring框架&#xff0c;简化了Spring应用程序的配置和部署过程&#xff0c;使开发者能够更快速地创建高效、可扩展的应用。 Spring Boot具有以下特点&#xff1a; 简…...

「解析」Jetson配置 git服务

这两天感冒了在家休养&#xff0c;想着把之前买的 Jetson 开发板用起来&#xff0c;买Jetson的初衷就是用来学习Linux系统&#xff0c;顺道可以部署算法&#xff0c;以及一些其他需求&#xff0c;相比树莓派而言&#xff0c;Jetson开发相对更贵&#xff0c;但是其配备了英伟达的…...

uniapp使用安装sass

1.首先你要安装node-sass npm install node-sass --save-dev2.安装sass-loader npm install sass-loader --save-dev3.修改style标签&#xff0c;声明使用sass <style lang"scss" scoped>...

ClickHouse学习笔记(六):ClickHouse物化视图使用

文章目录 1、ClickHouse 物化视图2、物化视图 vs 普通视图3、物化视图的优缺点4、物化视图的用法4.1、基本语法4.2、准备表结构4.3、准备数据4.3、查询结果 1、ClickHouse 物化视图 ClickHouse 的物化视图是一种查询结果的持久化&#xff0c;它的存在是为了带来查询效率的提升…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

安卓基础(aar)

重新设置java21的环境&#xff0c;临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的&#xff1a; MyApp/ ├── app/ …...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下&#xff0c;风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...