本文以HTTP请求和响应的过程来讲解涉及到的相关知识点。

第一

HTTP请求和相应步骤

图片来自:理解Http请求与响应http://android.jobbole.com/85218/

以上完整表示了HTTP请求和响应的7个步骤,下面从TCP/IP协议模型的角度来理解HTTP请求和响应如何传递的。

第二

TCP/IP协议

TCP/IP协议模型(Transmission Control Protocol/Internet Protocol),包含了一系列构成互联网基础的网络协议,是Internet的核心协议,通过20多年的发展已日渐成熟,并被广泛应用于局域网和广域网中,目前已成为事实上的国际标准。TCP/IP协议簇是一组不同层次上的多个协议的组合,通常被认为是一个四层协议系统,与OSI的七层模型相对应。

HTTP协议就是基于TCP/IP协议模型来传输信息的。

(1). 链路层

也称作数据链路层或网络接口层(在第一个图中为网络接口层和硬件层),通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡。它们一起处理与电缆(或其他任何传输媒介)的物理接口细节。ARP(地址解析协议)和RARP(逆地址解析协议)是某些网络接口(如以太网和令牌环网)使用的特殊协议,用来转换IP层和网络接口层使用的地址。

(2). 网络层

也称作互联网层(在第一个图中为网际层),处理分组在网络中的活动,例如分组的选路。在TCP/IP协议族中,网络层协议包括IP协议(网际协议),ICMP协议(Internet互联网控制报文协议),以及IGMP协议(Internet组管理协议)。

IP是一种网络层协议,提供的是一种不可靠的服务,它只是尽可能快地把分组从源结点送到目的结点,但是并不提供任何可靠性保证。同时被TCP和UDP使用。TCP和UDP的每组数据都通过端系统和每个中间路由器中的IP层在互联网中进行传输。

ICMP是IP协议的附属协议。IP层用它来与其他主机或路由器交换错误报文和其他重要信息。

IGMP是Internet组管理协议。它用来把一个UDP数据报多播到多个主机。

(3). 传输层

主要为两台主机上的应用程序提供端到端的通信。在TCP/IP协议族中,有两个互不相同的传输协议:TCP(传输控制协议)和UDP(用户数据报协议)。

TCP为两台主机提供高可靠性的数据通信。它所做的工作包括把应用程序交给它的数据分成合适的小块交给下面的网络层,确认接收到的分组,设置发送最后确认分组的超时时钟等。由于运输层提供了高可靠性的端到端的通信,因此应用层可以忽略所有这些细节。为了提供可靠的服务,TCP采用了超时重传、发送和接收端到端的确认分组等机制。

UDP则为应用层提供一种非常简单的服务。它只是把称作数据报的分组从一台主机发送到另一台主机,但并不保证该数据报能到达另一端。一个数据报是指从发送方传输到接收方的一个信息单元(例如,发送方指定的一定字节数的信息)。UDP协议任何必需的可靠性必须由应用层来提供。
(4). 应用层

应用层决定了向用户提供应用服务时通信的活动。TCP/IP 协议族内预存了各类通用的应用服务。包括 HTTP,FTP(File Transfer Protocol,文件传输协议),DNS(Domain Name System,域名系统)服务。

当应用程序用TCP传送数据时,数据被送入协议栈中,然后逐个通过每一层直到被当作一串比特流送入网络。其中每一层对收到的数据都要增加一些首部信息(有时还要增加尾部信息),该过程如图所示。

当目的主机收到一个以太网数据帧时,数据就开始从协议栈中由底向上升,同时去掉各层协议加上的报文首部。每层协议盒都要去检查报文首部中的协议标识,以确定接收数据的上层协议。这个过程称作分用(Demultiplexing)。协议是通过目的端口号、源I P地址和源端口号进行解包的。

通过以上步骤我们从TCP/IP模型的角度来理解了一次HTTP请求与响应的过程。

下面这张图更清楚明白:

下面具体来看如何进行一步步操作的。

第三

TCP三次握手

TCP是面向连接的,无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。在TCP/IP协议中,TCP协议提供可靠的连接服务,连接是通过三次握手进行初始化的。三次握手的目的是同步连接双方的序列号和确认号并交换 TCP窗口大小信息。

第一次握手:建立连接。客户端发送连接请求报文段,将SYN位置为1,Sequence Number为x;然后,客户端进入SYN_SEND状态,等待服务器的确认;

第二次握手:服务器收到SYN报文段。服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认,设置Acknowledgment Number为x+1(Sequence Number+1);同时,自己自己还要发送SYN请求信息,将SYN位置为1,Sequence Number为y;服务器端将上述所有信息放到一个报文段(即SYN+ACK报文段)中,一并发送给客户端,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN+ACK报文段。然后将Acknowledgment Number设置为y+1,向服务器发送ACK报文段,这个报文段发送完毕以后,客户端和服务器端都进入ESTABLISHED状态,完成TCP三次握手。

为什么要三次握手

为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。

具体例子:“已失效的连接请求报文段”的产生在这样一种情况下:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,server的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,client不会向server的确认发出确认。server由于收不到确认,就知道client并没有要求建立连接。”

第四

HTTP协议

Http是什么?

通俗来讲,他就是计算机通过网络进行通信的规则,是一个基于请求与响应,无状态的,应用层的协议,常基于TCP/IP协议传输数据。目前任何终端(手机,笔记本电脑。。)之间进行任何一种通信都必须按照Http协议进行,否则无法连接。

四个基于:

请求与响应:客户端发送请求,服务器端响应数据

无状态的:协议对于事务处理没有记忆能力,客户端第一次与服务器建立连接发送请求时需要进行一系列的安全认证匹配等,因此增加页面等待时间,当客户端向服务器端发送请求,服务器端响应完毕后,两者断开连接,也不保存连接状态,一刀两断!恩断义绝!从此路人!下一次客户端向同样的服务器发送请求时,由于他们之前已经遗忘了彼此,所以需要重新建立连接。

应用层:Http是属于应用层的协议,配合TCP/IP使用。

TCP/IP:Http使用TCP作为它的支撑运输协议。HTTP客户机发起一个与服务器的TCP连接,一旦连接建立,浏览器(客户机)和服务器进程就可以通过套接字接口访问TCP。

针对无状态的一些解决策略:

有时需要对用户之前的HTTP通信状态进行保存,比如执行一次登陆操作,在30分钟内所有的请求都不需要再次登陆。于是引入了Cookie技术。

HTTP/1.1想出了持久连接(HTTP keep-alive)方法。其特点是,只要任意一端没有明确提出断开连接,则保持TCP连接状态,在请求首部字段中的Connection: keep-alive即为表明使用了持久连接。
等等还有很多。。。。。。

下面开始讲解重头戏:HTTP请求报文,响应报文,对应于上述步骤的2,3,4,5,6。

HTTP报文是面向文本的,报文中的每一个字段都是一些ASCII码串,各个字段的长度是不确定的。HTTP有两类报文:请求报文和响应报文。

第五

HTTP请求报文

一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成,下图给出了请求报文的一般格式。

1.请求行

请求行分为三个部分:请求方法、请求地址和协议版本

请求方法

HTTP/1.1 定义的请求方法有8种:GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS、TRACE。

最常的两种GET和POST,如果是RESTful接口的话一般会用到GET、POST、DELETE、PUT。

请求地址

URL:统一资源定位符,是一种自愿位置的抽象唯一识别方法。

组成:<协议>://<主机>:<端口>/<路径>

端口和路径有时可以省略(HTTP默认端口号是80)

如下例:

有时会带参数,GET请求

协议版本

协议版本的格式为:HTTP/主版本号.次版本号,常用的有HTTP/1.0和HTTP/1.1

2.请求头部

请求头部为请求报文添加了一些附加信息,由“名/值”对组成,每行一对,名和值之间使用冒号分隔。

常见请求头如下:

请求头部的最后会有一个空行,表示请求头部结束,接下来为请求数据,这一行非常重要,必不可少。

3.请求数据

可选部分,比如GET请求就没有请求数据。

下面是一个POST方法的请求报文:

POST  /index.php HTTP/1.1    请求行
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:10.0.2) Gecko/20100101 Firefox/10.0.2  请求头
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8
Accept-Language: zh-cn,zh;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Referer: http://localhost/
Content-Length:25
Content-Type:application/x-www-form-urlencoded
  空行
username=aa&password=1234  请求数据

第六

HTTP响应报文

HTTP响应报文主要由状态行、响应头部、空行以及响应数据组成。

1.状态行

由3部分组成,分别为:协议版本,状态码,状态码描述。

其中协议版本与请求报文一致,状态码描述是对状态码的简单描述,所以这里就只介绍状态码。

状态码

状态代码为3位数字。
1xx:指示信息–表示请求已接收,继续处理。
2xx:成功–表示请求已被成功接收、理解、接受。
3xx:重定向–要完成请求必须进行更进一步的操作。
4xx:客户端错误–请求有语法错误或请求无法实现。
5xx:服务器端错误–服务器未能实现合法的请求。

下面列举几个常见的:两张趣图助你理解 HTTP 状态码!

2.响应头部

与请求头部类似,为响应报文添加了一些附加信息

常见响应头部如下:

3.响应数据

用于存放需要返回给客户端的数据信息。

下面是一个响应报文的实例:

HTTP/1.1 200 OK  状态行
Date: Sun, 17 Mar 2013 08:12:54 GMT  响应头部
Server: Apache/2.2.8 (Win32) PHP/5.2.5
X-Powered-By: PHP/5.2.5
Set-Cookie: PHPSESSID=c0huq7pdkmm5gg6osoe3mgjmm3; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Length: 4393
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=utf-8
  空行

  响应数据

HTTP响应示例<title><br /> </head><br /> <body><br /> Hello HTTP!<br /> </body><br /> </html></p> </blockquote> <p>关于请求头部和响应头部的知识点很多,这里只是简单介绍。</p> <p>通过以上步骤,数据已经传递完毕,HTTP/1.1会维持持久连接,但持续一段时间总会有关闭连接的时候,这时候据需要断开TCP连接。</p> <p>第七</p> <p>TCP四次挥手</p> <p>当客户端和服务器通过三次握手建立了TCP连接以后,当数据传送完毕,肯定是要断开TCP连接的啊。那对于TCP的断开连接,这里就有了神秘的“四次分手”。</p> <p><img alt="" src="/images/img8/1587090493892915.png" /></p> <p>第一次分手:主机1(可以使客户端,也可以是服务器端),设置Sequence Number,向主机2发送一个FIN报文段;此时,主机1进入FIN_WAIT_1状态;这表示主机1没有数据要发送给主机2了;</p> <p>第二次分手:主机2收到了主机1发送的FIN报文段,向主机1回一个ACK报文段,Acknowledgment Number为Sequence Number加1;主机1进入FIN_WAIT_2状态;主机2告诉主机1,我“同意”你的关闭请求;</p> <p>第三次分手:主机2向主机1发送FIN报文段,请求关闭连接,同时主机2进入LAST_ACK状态;</p> <p>第四次分手:主机1收到主机2发送的FIN报文段,向主机2发送ACK报文段,然后主机1进入TIME_WAIT状态;主机2收到主机1的ACK报文段以后,就关闭连接;此时,主机1等待2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,主机1也可以关闭连接了。</p> <h5>为什么要四次分手</h5> <p>TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。TCP是全双工模式,这就意味着,当主机1发出FIN报文段时,只是表示主机1已经没有数据要发送了,主机1告诉主机2,它的数据已经全部发送完毕了;但是,这个时候主机1还是可以接受来自主机2的数据;当主机2返回ACK报文段时,表示它已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的;当主机2也发送了FIN报文段时,这个时候就表示主机2也没有数据要发送了,就会告诉主机1,我也没有数据要发送了,之后彼此就会愉快的中断这次TCP连接。</p> <p>通过以上步骤便完成了HTTP的请求和响应,进行了数据传递,这其中涉及到需要知识点,都进行了逐一了解。</p> <blockquote> <p>来源:http://www.jianshu.com/p/c1d6a294d3c0</p> </blockquote> <div id="show-msk-answer-div" style="display: none"><br/><a href="javascript:void(0)" style="color: red;text-decoration: underline;" id="show-msk-answer"> >>> 点击获取完整版答案 <<< </a><br/></div><div id="read-more"><div id="read-more-mask"></div><a id="read-more-btn" target="_self">阅读全部内容</a></div><div style="margin-top:10px;">本文链接:<a style="color:#536de6" href="https://www.javastack.cn/a-complete-request-response-knowledge/">https://www.javastack.cn/a-complete-request-response-knowledge/</a></div><div class="" role="alert"><blockquote> <strong>声明:</strong>本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。 </blockquote></div><div class="entry-tags"><a href="https://www.javastack.cn/tag/http/" class="btn btn-sm btn-light mr-2" rel="tag">HTTP</a></div> <div class="entry-share"> <div class="row"> <div class="col d-none d-lg-block"> </div> <div class="col-auto mb-3 mb-lg-0"> <button class="share-poster btn btn-sm btn-white" data-id="2303" title="文章封面图"><i class="fa fa-share-alt"></i> 海报</button> <button class="go-copy btn btn-sm btn-white" data-toggle="tooltip" data-placement="top" title="点击复制链接" data-clipboard-text="https://www.javastack.cn/a-complete-request-response-knowledge/"><i class="fas fa-link"></i> 链接</button> </div> </div> </div> </div> </div> </div> </article> <div class="entry-navigation"> <div class="row"> <div class="col-lg-6 col-12"> <a class="entry-page-prev" href="https://www.javastack.cn/spring-boot-startup-one-second/" title="Spring Boot 启动,1 秒搞定!"> <div class="entry-page-icon"><i class="fas fa-arrow-left"></i></div> <div class="entry-page-info"> <span class="d-block rnav">上一篇</span> <span class="d-block title">Spring Boot 启动,1 秒搞定!</span> </div> </a> </div> <div class="col-lg-6 col-12"> <a class="entry-page-next" href="https://www.javastack.cn/intellij-idea-read-sources/" title="IntelliJ IDEA 阅读源码的 4 个绝技!"> <div class="entry-page-info"> <span class="d-block rnav">下一篇</span> <span class="d-block title">IntelliJ IDEA 阅读源码的 4 个绝技!</span> </div> <div class="entry-page-icon"><i class="fas fa-arrow-right"></i></div> </a> </div> </div> </div> <div class="related-posts"> <h3 class="u-border-title">相关文章</h3> <div class="row"> <div class="col-lg-6 col-12"> <article id="post-2728" class="post post-list post-2728 type-post status-publish format-standard hentry category-interview category-interview-questions tag-http tag-java"> <div class="entry-media"><div class="placeholder" style="padding-bottom: 66.666666666667%"><a href="https://www.javastack.cn/internet-mst/" title="网络编程面试题(共40+)" rel="nofollow noopener noreferrer"><img class="lazyload" data-src="/images/cover/http.png" src="/images/cover/loadding.gif" alt="网络编程面试题(共40+)" /></a></div></div> <div class="entry-wrapper"> <header class="entry-header"><h2 class="entry-title"><a href="https://www.javastack.cn/internet-mst/" title="网络编程面试题(共40+)" rel="bookmark">网络编程面试题(共40+)</a></h2></header> <div class="entry-footer"> <div class="entry-meta"> <span class="meta-category"> <a href="https://www.javastack.cn/interview/" rel="category">面试大全</a> </span> <span class="meta-date"> <time datetime="2022-01-20T17:27:11+08:00"> <i class="fa fa-clock-o"></i> 8月前 </time> </span> <span class="meta-views"><i class="fa fa-eye"></i> 24</span> </div> </div> </div> </article> </div> <div class="col-lg-6 col-12"> <article id="post-2295" class="post post-list post-2295 type-post status-publish format-standard hentry category-http category-more tag-http"> <div class="entry-media"><div class="placeholder" style="padding-bottom: 66.666666666667%"><a href="https://www.javastack.cn/http-2-0-vs-1-1/" title="HTTP 2.0 和 1.1 区别" rel="nofollow noopener noreferrer"><img class="lazyload" data-src="/images/img0/1587087378564915.png" src="/images/cover/loadding.gif" alt="HTTP 2.0 和 1.1 区别" /></a></div></div> <div class="entry-wrapper"> <header class="entry-header"><h2 class="entry-title"><a href="https://www.javastack.cn/http-2-0-vs-1-1/" title="HTTP 2.0 和 1.1 区别" rel="bookmark">HTTP 2.0 和 1.1 区别</a></h2></header> <div class="entry-footer"> <div class="entry-meta"> <span class="meta-category"> <a href="https://www.javastack.cn/more/http/" rel="category">HTTP</a> </span> <span class="meta-date"> <time datetime="2020-04-17T00:00:00+08:00"> <i class="fa fa-clock-o"></i> 2年前 </time> </span> <span class="meta-views"><i class="fa fa-eye"></i> 8</span> </div> </div> </div> </article> </div> <div class="col-lg-6 col-12"> <article id="post-2297" class="post post-list post-2297 type-post status-publish format-standard hentry category-http category-more tag-http"> <div class="entry-media"><div class="placeholder" style="padding-bottom: 66.666666666667%"><a href="https://www.javastack.cn/http-protocol-extremely-brief-tutorial/" title="漫画:HTTP 协议极简教程,傻瓜都能看懂!" rel="nofollow noopener noreferrer"><img class="lazyload" data-src="/images/img9/1587087377163915.png" src="/images/cover/loadding.gif" alt="漫画:HTTP 协议极简教程,傻瓜都能看懂!" /></a></div></div> <div class="entry-wrapper"> <header class="entry-header"><h2 class="entry-title"><a href="https://www.javastack.cn/http-protocol-extremely-brief-tutorial/" title="漫画:HTTP 协议极简教程,傻瓜都能看懂!" rel="bookmark">漫画:HTTP 协议极简教程,傻瓜都能看懂!</a></h2></header> <div class="entry-footer"> <div class="entry-meta"> <span class="meta-category"> <a href="https://www.javastack.cn/more/http/" rel="category">HTTP</a> </span> <span class="meta-date"> <time datetime="2020-04-17T00:00:00+08:00"> <i class="fa fa-clock-o"></i> 2年前 </time> </span> <span class="meta-views"><i class="fa fa-eye"></i> 2</span> </div> </div> </div> </article> </div> <div class="col-lg-6 col-12"> <article id="post-2301" class="post post-list post-2301 type-post status-publish format-standard hentry category-http category-more tag-http"> <div class="entry-media"><div class="placeholder" style="padding-bottom: 66.666666666667%"><a href="https://www.javastack.cn/http-caching-mechanism-and-principle/" title="彻底弄懂 HTTP 缓存机制及原理!" rel="nofollow noopener noreferrer"><img class="lazyload" data-src="/images/img8/1587087374836915.png" src="/images/cover/loadding.gif" alt="彻底弄懂 HTTP 缓存机制及原理!" /></a></div></div> <div class="entry-wrapper"> <header class="entry-header"><h2 class="entry-title"><a href="https://www.javastack.cn/http-caching-mechanism-and-principle/" title="彻底弄懂 HTTP 缓存机制及原理!" rel="bookmark">彻底弄懂 HTTP 缓存机制及原理!</a></h2></header> <div class="entry-footer"> <div class="entry-meta"> <span class="meta-category"> <a href="https://www.javastack.cn/more/http/" rel="category">HTTP</a> </span> <span class="meta-date"> <time datetime="2020-04-17T00:00:00+08:00"> <i class="fa fa-clock-o"></i> 2年前 </time> </span> <span class="meta-views"><i class="fa fa-eye"></i> 2</span> </div> </div> </div> </article> </div> </div> </div> <div id="comments" class="entry-comments"> <div id="respond" class="comment-respond"> <h3 id="reply-title" class="comment-reply-title">发表回复 <small><a rel="nofollow" id="cancel-comment-reply-link" href="/a-complete-request-response-knowledge/#respond" style="display:none;">取消回复</a></small></h3><form action="https://www.javastack.cn/wp-comments-post.php" method="post" id="commentform" class="comment-form" novalidate><p class="comment-notes"><span id="email-notes">您的电子邮箱地址不会被公开。</span> <span class="required-field-message" aria-hidden="true">必填项已用<span class="required" aria-hidden="true">*</span>标注</span></p><div class="comment-form-comment"><a class="btn btn-sm btn-link" href="javascript:embedImage();">插入图片</a><textarea id="comment" name="comment" class="required" rows="4" placeholder="请输入评论内容..."></textarea></div><div class="comment-form-author"><input id="author" name="author" type="text" placeholder="*昵称: " value="" size="30"></div> <div class="comment-form-email"><input id="email" name="email" type="text" placeholder="*邮箱: " value=""></div> <div class="comment-form-url"><input id="url" name="url" type="text" placeholder="网址: " value="" size="30"></div> <div class="comment-form-cookies-consent"><input id="wp-comment-cookies-consent" name="wp-comment-cookies-consent" type="checkbox" value="yes" checked="checked" > 浏览器会保存昵称、邮箱和网站cookies信息,下次评论时使用。</div> <div class="form-submit"><input name="submit" type="submit" id="submit" class="submit" value="提交" /> <input type='hidden' name='comment_post_ID' value='2303' id='comment_post_ID' /> <input type='hidden' name='comment_parent' id='comment_parent' value='0' /> </div></form> </div><!-- #respond --> </div> </div> </div> <div class="sidebar-column col-lg-3"> <aside id="secondary" class="widget-area"> <div id="custom_html-4" class="widget_text widget widget_custom_html"><div class="textwidget custom-html-widget"><div id="magsy_about_widget-3" class="widget widget_magsy_about_widget" style="margin: 0 auto;"><img class="profile-image lazyloaded" data-src="https://www.javastack.cn/images/javastack.png" src="https://www.javastack.cn/images/javastack.png" alt="" style="margin: 0 auto;"> <div class="jwp-center">关注公众号:Java技术栈,技术干货及时推送。</div></div></div></div> <div id="recent-posts-8" class="widget widget_recent_entries"> <h5 class="widget-title">最近更新</h5> <ul> <li> <a href="https://www.javastack.cn/spring-cloud-alibaba-2021-0-4-0-released/">Spring Cloud Alibaba 最新版发布!</a> </li> <li> <a href="https://www.javastack.cn/spring-cloud-2021-0-4-released/">Spring Cloud 最新版发布,干掉 JSch,支持 Mina,这次真的追不动了。。</a> </li> <li> <a href="https://www.javastack.cn/careful-use-parallelstream/">求求你们了,别再乱用 parallelStream 了,速度竟然比 Stream 还要慢!!</a> </li> <li> <a href="https://www.javastack.cn/nacos-2-1-1-released/">Nacos 2.1.1 正式发布,真心强!</a> </li> <li> <a href="https://www.javastack.cn/spring-cloud-alibaba-course/">Spring Cloud Alibaba 微服务实战课</a> </li> <li> <a href="https://www.javastack.cn/nginx-limit-req-zone-hole/">Nginx 限流的天坑!!</a> </li> <li> <a href="https://www.javastack.cn/intellij-idea-work-dir/">IntelliJ IDEA 工作目录</a> </li> <li> <a href="https://www.javastack.cn/writing-with-yuque/">用语雀写文章了,功能真心强大!</a> </li> <li> <a href="https://www.javastack.cn/stopwatch-waste-time-statistics/">别再用 System.currentTimeMillis() 统计耗时了,太 Low,StopWatch 好用到爆!</a> </li> <li> <a href="https://www.javastack.cn/java-8-sort-ten-ways/">Java 8 排序的 10 个姿势,太秀了吧!同事直呼看不懂。。</a> </li> </ul> </div><div id="tag_cloud-2" class="widget widget_tag_cloud"><h5 class="widget-title">Tags</h5><div class="tagcloud"><a href="https://www.javastack.cn/tag/docker/" class="tag-cloud-link tag-link-107 tag-link-position-1" style="font-size: 9.8421052631579pt;" aria-label="Docker (6个项目)">Docker<span class="tag-link-count"> (6)</span></a> <a href="https://www.javastack.cn/tag/dubbo/" class="tag-cloud-link tag-link-88 tag-link-position-2" style="font-size: 12.642105263158pt;" aria-label="Dubbo (16个项目)">Dubbo<span class="tag-link-count"> (16)</span></a> <a href="https://www.javastack.cn/tag/eclipse/" class="tag-cloud-link tag-link-114 tag-link-position-3" style="font-size: 9.3263157894737pt;" aria-label="Eclipse (5个项目)">Eclipse<span class="tag-link-count"> (5)</span></a> <a href="https://www.javastack.cn/tag/elastic-job/" class="tag-cloud-link tag-link-89 tag-link-position-4" style="font-size: 8.7368421052632pt;" aria-label="Elastic Job (4个项目)">Elastic Job<span class="tag-link-count"> (4)</span></a> <a href="https://www.javastack.cn/tag/git/" class="tag-cloud-link tag-link-115 tag-link-position-5" style="font-size: 14.263157894737pt;" aria-label="Git (27个项目)">Git<span class="tag-link-count"> (27)</span></a> <a href="https://www.javastack.cn/tag/github/" class="tag-cloud-link tag-link-116 tag-link-position-6" style="font-size: 11.536842105263pt;" aria-label="Github (11个项目)">Github<span class="tag-link-count"> (11)</span></a> <a href="https://www.javastack.cn/tag/http/" class="tag-cloud-link tag-link-80 tag-link-position-7" style="font-size: 12.421052631579pt;" aria-label="HTTP (15个项目)">HTTP<span class="tag-link-count"> (15)</span></a> <a href="https://www.javastack.cn/tag/intellij-idea/" class="tag-cloud-link tag-link-117 tag-link-position-8" style="font-size: 15.663157894737pt;" aria-label="IntelliJ IDEA (43个项目)">IntelliJ IDEA<span class="tag-link-count"> (43)</span></a> <a href="https://www.javastack.cn/tag/java/" class="tag-cloud-link tag-link-13 tag-link-position-9" style="font-size: 22pt;" aria-label="Java (313个项目)">Java<span class="tag-link-count"> (313)</span></a> <a href="https://www.javastack.cn/tag/java-8/" class="tag-cloud-link tag-link-92 tag-link-position-10" style="font-size: 14.705263157895pt;" aria-label="Java 8 (31个项目)">Java 8<span class="tag-link-count"> (31)</span></a> <a href="https://www.javastack.cn/tag/java-10/" class="tag-cloud-link tag-link-98 tag-link-position-11" style="font-size: 8pt;" aria-label="Java 10 (3个项目)">Java 10<span class="tag-link-count"> (3)</span></a> <a href="https://www.javastack.cn/tag/java-12/" class="tag-cloud-link tag-link-96 tag-link-position-12" style="font-size: 8pt;" aria-label="Java 12 (3个项目)">Java 12<span class="tag-link-count"> (3)</span></a> <a href="https://www.javastack.cn/tag/java-14/" class="tag-cloud-link tag-link-93 tag-link-position-13" style="font-size: 8.7368421052632pt;" aria-label="Java 14 (4个项目)">Java 14<span class="tag-link-count"> (4)</span></a> <a href="https://www.javastack.cn/tag/jvm/" class="tag-cloud-link tag-link-78 tag-link-position-14" style="font-size: 13.305263157895pt;" aria-label="JVM (20个项目)">JVM<span class="tag-link-count"> (20)</span></a> <a href="https://www.javastack.cn/tag/kafka/" class="tag-cloud-link tag-link-125 tag-link-position-15" style="font-size: 9.3263157894737pt;" aria-label="Kafka (5个项目)">Kafka<span class="tag-link-count"> (5)</span></a> <a href="https://www.javastack.cn/tag/linux/" class="tag-cloud-link tag-link-100 tag-link-position-16" style="font-size: 11.242105263158pt;" aria-label="Linux (10个项目)">Linux<span class="tag-link-count"> (10)</span></a> <a href="https://www.javastack.cn/tag/log4j/" class="tag-cloud-link tag-link-137 tag-link-position-17" style="font-size: 12.052631578947pt;" aria-label="Log4j (13个项目)">Log4j<span class="tag-link-count"> (13)</span></a> <a href="https://www.javastack.cn/tag/maven/" class="tag-cloud-link tag-link-118 tag-link-position-18" style="font-size: 12.863157894737pt;" aria-label="Maven (17个项目)">Maven<span class="tag-link-count"> (17)</span></a> <a href="https://www.javastack.cn/tag/mybatis/" class="tag-cloud-link tag-link-101 tag-link-position-19" style="font-size: 11.242105263158pt;" aria-label="MyBatis (10个项目)">MyBatis<span class="tag-link-count"> (10)</span></a> <a href="https://www.javastack.cn/tag/mysql/" class="tag-cloud-link tag-link-120 tag-link-position-20" style="font-size: 12.421052631579pt;" aria-label="MySQL (15个项目)">MySQL<span class="tag-link-count"> (15)</span></a> <a href="https://www.javastack.cn/tag/nacos/" class="tag-cloud-link tag-link-138 tag-link-position-21" style="font-size: 8.7368421052632pt;" aria-label="Nacos (4个项目)">Nacos<span class="tag-link-count"> (4)</span></a> <a href="https://www.javastack.cn/tag/netty/" class="tag-cloud-link tag-link-102 tag-link-position-22" style="font-size: 9.3263157894737pt;" aria-label="Netty (5个项目)">Netty<span class="tag-link-count"> (5)</span></a> <a href="https://www.javastack.cn/tag/nginx/" class="tag-cloud-link tag-link-103 tag-link-position-23" style="font-size: 10.210526315789pt;" aria-label="Nginx (7个项目)">Nginx<span class="tag-link-count"> (7)</span></a> <a href="https://www.javastack.cn/tag/rabbitmq/" class="tag-cloud-link tag-link-126 tag-link-position-24" style="font-size: 8pt;" aria-label="RabbitMQ (3个项目)">RabbitMQ<span class="tag-link-count"> (3)</span></a> <a href="https://www.javastack.cn/tag/redis/" class="tag-cloud-link tag-link-121 tag-link-position-25" style="font-size: 14.484210526316pt;" aria-label="Redis (29个项目)">Redis<span class="tag-link-count"> (29)</span></a> <a href="https://www.javastack.cn/tag/shiro/" class="tag-cloud-link tag-link-104 tag-link-position-26" style="font-size: 8.7368421052632pt;" aria-label="Shiro (4个项目)">Shiro<span class="tag-link-count"> (4)</span></a> <a href="https://www.javastack.cn/tag/spring/" class="tag-cloud-link tag-link-81 tag-link-position-27" style="font-size: 19.863157894737pt;" aria-label="Spring (163个项目)">Spring<span class="tag-link-count"> (163)</span></a> <a href="https://www.javastack.cn/tag/spring-boot/" class="tag-cloud-link tag-link-83 tag-link-position-28" style="font-size: 19.052631578947pt;" aria-label="Spring Boot (124个项目)">Spring Boot<span class="tag-link-count"> (124)</span></a> <a href="https://www.javastack.cn/tag/spring-cloud/" class="tag-cloud-link tag-link-84 tag-link-position-29" style="font-size: 15.663157894737pt;" aria-label="Spring Cloud (43个项目)">Spring Cloud<span class="tag-link-count"> (43)</span></a> <a href="https://www.javastack.cn/tag/spring-mvc/" class="tag-cloud-link tag-link-82 tag-link-position-30" style="font-size: 9.3263157894737pt;" aria-label="Spring MVC (5个项目)">Spring MVC<span class="tag-link-count"> (5)</span></a> <a href="https://www.javastack.cn/tag/tomcat/" class="tag-cloud-link tag-link-105 tag-link-position-31" style="font-size: 10.578947368421pt;" aria-label="Tomcat (8个项目)">Tomcat<span class="tag-link-count"> (8)</span></a> <a href="https://www.javastack.cn/tag/zookeeper/" class="tag-cloud-link tag-link-106 tag-link-position-32" style="font-size: 9.3263157894737pt;" aria-label="Zookeeper (5个项目)">Zookeeper<span class="tag-link-count"> (5)</span></a> <a href="https://www.javastack.cn/tag/blockchain/" class="tag-cloud-link tag-link-111 tag-link-position-33" style="font-size: 9.8421052631579pt;" aria-label="区块链 (6个项目)">区块链<span class="tag-link-count"> (6)</span></a> <a href="https://www.javastack.cn/tag/thread/" class="tag-cloud-link tag-link-17 tag-link-position-34" style="font-size: 15.736842105263pt;" aria-label="多线程 (44个项目)">多线程<span class="tag-link-count"> (44)</span></a> <a href="https://www.javastack.cn/tag/security/" class="tag-cloud-link tag-link-112 tag-link-position-35" style="font-size: 14.336842105263pt;" aria-label="安全 (28个项目)">安全<span class="tag-link-count"> (28)</span></a> <a href="https://www.javastack.cn/tag/microservice/" class="tag-cloud-link tag-link-109 tag-link-position-36" style="font-size: 10.947368421053pt;" aria-label="微服务 (9个项目)">微服务<span class="tag-link-count"> (9)</span></a> <a href="https://www.javastack.cn/tag/new-features/" class="tag-cloud-link tag-link-91 tag-link-position-37" style="font-size: 15.957894736842pt;" aria-label="新特性 (47个项目)">新特性<span class="tag-link-count"> (47)</span></a> <a href="https://www.javastack.cn/tag/arth/" class="tag-cloud-link tag-link-124 tag-link-position-38" style="font-size: 17.652631578947pt;" aria-label="架构 (80个项目)">架构<span class="tag-link-count"> (80)</span></a> <a href="https://www.javastack.cn/tag/vulnerability/" class="tag-cloud-link tag-link-113 tag-link-position-39" style="font-size: 14.336842105263pt;" aria-label="漏洞 (28个项目)">漏洞<span class="tag-link-count"> (28)</span></a> <a href="https://www.javastack.cn/tag/coding-life/" class="tag-cloud-link tag-link-127 tag-link-position-40" style="font-size: 15.736842105263pt;" aria-label="程序人生 (44个项目)">程序人生<span class="tag-link-count"> (44)</span></a> <a href="https://www.javastack.cn/tag/arithmetic/" class="tag-cloud-link tag-link-123 tag-link-position-41" style="font-size: 9.3263157894737pt;" aria-label="算法 (5个项目)">算法<span class="tag-link-count"> (5)</span></a> <a href="https://www.javastack.cn/tag/system-arth/" class="tag-cloud-link tag-link-140 tag-link-position-42" style="font-size: 17.652631578947pt;" aria-label="系统架构 (80个项目)">系统架构<span class="tag-link-count"> (80)</span></a> <a href="https://www.javastack.cn/tag/design-pattern/" class="tag-cloud-link tag-link-85 tag-link-position-43" style="font-size: 12.273684210526pt;" aria-label="设计模式 (14个项目)">设计模式<span class="tag-link-count"> (14)</span></a> <a href="https://www.javastack.cn/tag/java-collection/" class="tag-cloud-link tag-link-79 tag-link-position-44" style="font-size: 13.010526315789pt;" aria-label="集合 (18个项目)">集合<span class="tag-link-count"> (18)</span></a> <a href="https://www.javastack.cn/tag/mst/" class="tag-cloud-link tag-link-77 tag-link-position-45" style="font-size: 14.705263157895pt;" aria-label="面试题 (31个项目)">面试题<span class="tag-link-count"> (31)</span></a></div> </div><div id="recent-comments-4" class="widget widget_recent_comments"><h5 class="widget-title">近期评论</h5><ul id="recentcomments"><li class="recentcomments"><span class="comment-author-link">匿名</span>发表在《<a href="https://www.javastack.cn/writing-with-yuque/#comment-6">用语雀写文章了,功能真心强大!</a>》</li><li class="recentcomments"><span class="comment-author-link">匿名</span>发表在《<a href="https://www.javastack.cn/stopwatch-waste-time-statistics/#comment-5">别再用 System.currentTimeMillis() 统计耗时了,太 Low,StopWatch 好用到爆!</a>》</li><li class="recentcomments"><span class="comment-author-link">匿名</span>发表在《<a href="https://www.javastack.cn/nginx-limit-req-zone-hole/#comment-4">Nginx 限流的天坑!!</a>》</li><li class="recentcomments"><span class="comment-author-link">游客</span>发表在《<a href="https://www.javastack.cn/spring-data-binding-rce-issues/#comment-3">疯了!Spring 再爆惊天大漏洞。。</a>》</li></ul></div></aside><!-- #secondary --> </div> </div> </div> </main><!-- #main --> <footer class="site-footer"> <div class="footer-widget d-none d-lg-block"> <div class="container"> <div class="row"> <div class="col-lg-3 col-md"> <div class="footer-info"> <div class="logo mb-2"> <img class="logo" src="/images/site/logo.png" alt="Java技术栈"> </div> <p class="desc mb-0">Java技术栈是一个专注分享Java技术的网站,大部分内容为作者原创,首发公众号:Java技术栈,少量转载转载于网络并保留出版,如有侵权请联系处理。</p> </div> </div> <div class="col-lg-9 col-auto widget-warp"> <div class="d-flex justify-content-xl-between"> <div id="linkcat-73" class="widget widget_links"><h5 class="widget-title">文章源代码</h5> <ul class='xoxo blogroll'> <li><a href="https://github.com/javastacks/javastack" rel="noopener" title="本站 Java 系列文章实战源代码" target="_blank">Java 实战源代码</a></li> <li><a href="https://github.com/javastacks/spring-boot-best-practice" rel="noopener" title="本站 Spring Boot 系列文章实战源代码" target="_blank">Spring Boot 实战源代码</a></li> </ul> </div> <div id="linkcat-74" class="widget widget_links"><h5 class="widget-title">关于本站</h5> <ul class='xoxo blogroll'> <li><a href="/aboutus" rel="noopener" title="关于Java技术栈" target="_blank">关于我们</a></li> <li><a href="/aboutus" rel="noopener" title="联系作者" target="_blank">联系作者</a></li> </ul> </div> <div id="custom_html-7" class="widget_text widget widget_custom_html"><div class="textwidget custom-html-widget"><div id="magsy_about_widget-3" class="footer-mp-div widget widget_magsy_about_widget"><img class="profile-image lazyloaded footer-mp-img" data-src="https://www.javastack.cn/images/javastack.png" src="https://www.javastack.cn/images/javastack.png" alt=""> <div class="footer-mp-text">关注公众号「 Java技术栈 」</div> <div class="footer-mp-text">技术干货及时推送</div> </div></div></div> </div> </div> </div> </div> </div> <div class="footer-links d-none d-lg-block"> <div class="container"> <h6>友情链接:</h6> <ul class="friendlinks-ul"> <li><a target="_blank" href="https://www.javastack.cn" title="Java技术栈" rel="noopener noreferrer">Java技术栈</a></li> </ul> </div> </div> <div class="footer-copyright d-flex text-center"> <div class="container"> <p class="m-0 small"> Copyright © 2022 <a href="https://javastack.cn/">Java技术栈</a> - All rights reserved<a href="https://beian.miit.gov.cn" target="_blank" rel="noreferrer nofollow">粤ICP备18026527号</a> </p> </div> </div> </footer><!-- #footer --> </div><!-- #page --> <div class="rollbar"> <div class="rollbar-item back-to-top"> <i class="fas fa-chevron-up"></i> </div> </div> <div class="m-menubar"> </div> <div id="omnisearch" class="omnisearch"> <div class="container"> <form class="omnisearch-form" method="get" action="https://www.javastack.cn/"> <div class="form-group"> <div class="input-group input-group-merge input-group-flush"> <div class="input-group-prepend"> <span class="input-group-text"><i class="fas fa-search"></i></span> </div> <div class="input-group-prepend d-flex align-items-center" style=" max-width: 35%; "> <select name='cat' id='omnisearch-cat' class='selectpicker' > <option value=''>全部</option> <option class="level-0" value="7">Java</option> <option class="level-0" value="8">Spring</option> <option class="level-0" value="34">云原生</option> <option class="level-0" value="45">后端技术</option> <option class="level-0" value="51">开发工具</option> <option class="level-0" value="66">技术动态</option> <option class="level-0" value="28">数据库</option> <option class="level-0" value="68">更多</option> <option class="level-0" value="1">未分类</option> <option class="level-0" value="46">架构设计</option> <option class="level-0" value="60">消息队列</option> <option class="level-0" value="67">面试大全</option> </select> </div> <input type="text" class="search-ajax-input form-control" name="s" value="" placeholder="输入关键词 回车搜索..." autocomplete="off"> </div> </div> </form> <div class="omnisearch-suggestions"> <div class="search-keywords"> <a href="https://www.javastack.cn/tag/java/" class="tag-cloud-link tag-link-13 tag-link-position-1" style="font-size: 14px;">Java</a> <a href="https://www.javastack.cn/java/" class="tag-cloud-link tag-link-7 tag-link-position-2" style="font-size: 14px;">Java</a> <a href="https://www.javastack.cn/tag/spring/" class="tag-cloud-link tag-link-81 tag-link-position-3" style="font-size: 14px;">Spring</a> <a href="https://www.javastack.cn/spring/" class="tag-cloud-link tag-link-8 tag-link-position-4" style="font-size: 14px;">Spring</a> <a href="https://www.javastack.cn/tag/spring-boot/" class="tag-cloud-link tag-link-83 tag-link-position-5" style="font-size: 14px;">Spring Boot</a> <a href="https://www.javastack.cn/spring/spring-boot/" class="tag-cloud-link tag-link-9 tag-link-position-6" style="font-size: 14px;">Spring Boot</a> <a href="https://www.javastack.cn/java/other-java/" class="tag-cloud-link tag-link-21 tag-link-position-7" style="font-size: 14px;">其他</a> <a href="https://www.javastack.cn/backend/" class="tag-cloud-link tag-link-45 tag-link-position-8" style="font-size: 14px;">后端技术</a> <a href="https://www.javastack.cn/devtools/" class="tag-cloud-link tag-link-51 tag-link-position-9" style="font-size: 14px;">开发工具</a> <a href="https://www.javastack.cn/tech-latest/" class="tag-cloud-link tag-link-66 tag-link-position-10" style="font-size: 14px;">技术动态</a> <a href="https://www.javastack.cn/tech-latest/tech-news/" class="tag-cloud-link tag-link-135 tag-link-position-11" style="font-size: 14px;">技术资讯</a> <a href="https://www.javastack.cn/more/" class="tag-cloud-link tag-link-68 tag-link-position-12" style="font-size: 14px;">更多</a> <a href="https://www.javastack.cn/tag/arth/" class="tag-cloud-link tag-link-124 tag-link-position-13" style="font-size: 14px;">架构</a> <a href="https://www.javastack.cn/arth/" class="tag-cloud-link tag-link-46 tag-link-position-14" style="font-size: 14px;">架构设计</a> <a href="https://www.javastack.cn/tag/system-arth/" class="tag-cloud-link tag-link-140 tag-link-position-15" style="font-size: 14px;">系统架构</a> <a href="https://www.javastack.cn/arth/system-arth/" class="tag-cloud-link tag-link-139 tag-link-position-16" style="font-size: 14px;">系统架构</a> <a href="https://www.javastack.cn/interview/" class="tag-cloud-link tag-link-67 tag-link-position-17" style="font-size: 14px;">面试大全</a> <a href="https://www.javastack.cn/interview/interview-experience/" class="tag-cloud-link tag-link-76 tag-link-position-18" style="font-size: 14px;">面试经验</a> </div> </div> </div> </div> <div class="dimmer"></div> <div class="off-canvas"> <div class="canvas-close"><i class="fas fa-times"></i></div> <div class="mobile-menu d-block d-xl-none d-lg-none"></div> </div> <script src='https://www.javastack.cn/wp-content/themes/ripro-v2/assets/js/popper.min.js?ver=4.2.0' id='popper-js'></script> <script src='https://www.javastack.cn/wp-content/themes/ripro-v2/assets/bootstrap/js/bootstrap.min.js?ver=4.6.0' id='bootstrap-js'></script> <script src='https://www.javastack.cn/wp-content/themes/ripro-v2/assets/js/jquery.alert.js?ver=1.0.0' id='jquery_alert-js'></script> <script src='https://www.javastack.cn/wp-content/themes/ripro-v2/assets/js/jquery.cookie.js?ver=1.0.0' id='jquery_cookie-js'></script> <script src='https://www.javastack.cn/wp-content/themes/ripro-v2/assets/js/readmore.js?ver=1.0.1' id='readmore-js'></script> <script src='https://www.javastack.cn/wp-content/themes/ripro-v2/assets/js/plugins.js?ver=4.2.0' id='plugins-js'></script> <script id='app-js-extra'> var riprov2 = {"home_url":"https:\/\/www.javastack.cn","admin_url":"https:\/\/www.javastack.cn\/wp-admin\/admin-ajax.php","is_qq_captcha":"0","is_single_gallery":"1","comment_list_order":"desc","infinite_load":"\u52a0\u8f7d\u66f4\u591a","infinite_loading":"\u52a0\u8f7d\u4e2d...","site_notice":{"is":"0","auto":"0","color":"#5b5b5b","html":"<div class=\"notify-content\"><h3><i class=\"fa fa-bell-o mr-2\"><\/i>RiPro-v2\u6700\u65b0\u7248\u672c\u66f4\u65b0\u65e5\u5fd7<\/h3><div>\u8fd9\u662f\u4e00\u6761\u7f51\u7ad9\u516c\u544a\uff0c\u53ef\u5728\u540e\u53f0\u5f00\u542f\u6216\u5173\u95ed\uff0c\u53ef\u81ea\u5b9a\u4e49\u80cc\u666f\u989c\u8272\uff0c\u6807\u9898\uff0c\u5185\u5bb9\uff0c\u6b64\u5904\u53ef\u4f7f\u7528html\u6807\u7b7e...<\/div><\/div>"},"site_js_text":{"login_txt":"\u8bf7\u70b9\u51fb\u5b89\u5168\u9a8c\u8bc1","reg1_txt":"\u90ae\u7bb1\u683c\u5f0f\u9519\u8bef","reg2_txt":"\u8bf7\u70b9\u51fb\u5b89\u5168\u9a8c\u8bc1","pass_txt":"\u8bf7\u70b9\u51fb\u5b89\u5168\u9a8c\u8bc1","bind_txt":"\u8bf7\u70b9\u51fb\u9a8c\u8bc1\u6309\u94ae\u8fdb\u884c\u9a8c\u8bc1","copy_txt":" \u590d\u5236\u6210\u529f","poster_txt":"\u6d77\u62a5\u52a0\u8f7d\u5f02\u5e38","mpwx1_txt":"\u8bf7\u4f7f\u7528\u5fae\u4fe1\u626b\u7801\u767b\u5f55","mpwx2_txt":"\u5173\u6ce8\u516c\u4f17\u53f7\u5373\u53ef\u767b\u5f55<\/br>\u4e8c\u7ef4\u7801\u6709\u6548\u671f3\u5206\u949f","pay1_txt":"\u652f\u4ed8\u5b8c\u6210","pay2_txt":"\u53d6\u6d88\u652f\u4ed8","pay3_txt":"\u652f\u4ed8\u6210\u529f","capt_txt":"\u9a8c\u8bc1\u4e2d","capt1_txt":"\u9a8c\u8bc1\u901a\u8fc7","capt2_txt":"\u9a8c\u8bc1\u5931\u8d25","prompt_txt":"\u8bf7\u8f93\u5165\u56fe\u7247URL\u5730\u5740","comment_txt":"\u63d0\u4ea4\u4e2d....","comment1_txt":"\u63d0\u4ea4\u6210\u529f"},"jquey":"1","singular_id":"2303"}; </script> <script src='https://www.javastack.cn/wp-content/themes/ripro-v2/assets/js/app.js?ver=4.2.0' id='app-js'></script> <script src='https://www.javastack.cn/wp-content/themes/ripro-v2/assets/spotlight/spotlight.bundle.js?ver=0.7.0' id='spotlight-js'></script> <script src='https://www.javastack.cn/wp-content/themes/ripro-v2/assets/jarallax/jarallax.min.js?ver=1.12.5' id='jarallax-js'></script> <script src='https://www.javastack.cn/wp-content/themes/ripro-v2/assets/jarallax/jarallax-video.min.js?ver=1.0.1' id='jarallax-video-js'></script> <script src='https://www.javastack.cn/wp-includes/js/comment-reply.min.js?ver=6.0.2' id='comment-reply-js'></script> <script src='https://www.javastack.cn/wp-includes/js/clipboard.min.js?ver=2.0.10' id='clipboard-js'></script> <script id="preference-link-target"> (function($) { $(function() { $(".post").find("a").each(function() { var link_href = $(this).attr("href"); if (link_href.indexOf("#") == -1) { $(this).attr("target", "_blank"); } }); }); })(jQuery); </script> <script id="module-highlight-js"> (function($) { $(function() { $("pre code").each(function(i, e) { var thisclass = $(this).attr("class"); if (typeof thisclass !== "undefined") { if ( thisclass.indexOf("katex") === -1 && thisclass.indexOf("mermaid") === -1 && thisclass.indexOf("seq") === -1 && thisclass.indexOf("flow") === -1 ) { if (typeof hljs !== "undefined") { $(this).closest("pre").addClass("hljs"); hljs.highlightBlock(e); } else { console.log("%c WP Githuber MD %c You have enabled highlight.js modules already, but you have to update this post to take effect, identifying which file should be loaded.\nGithuber MD does not load a whole-fat-packed file for every post.", "background: #222; color: #bada55", "color: #637338"); } } } }); }); })(jQuery); </script> <script id="module-clipboard"> (function($) { $(function() { var pre = document.getElementsByTagName("pre"); var pasteContent = document.getElementById("paste-content"); var hasLanguage = false; for (var i = 0; i < pre.length; i++) { var codeClass = pre[i].children[0].className; var isLanguage = codeClass.indexOf("language-"); var excludedCodeClassNames = [ "language-katex", "language-seq", "language-sequence", "language-flow", "language-flowchart", "language-mermaid", ]; var isExcluded = excludedCodeClassNames.indexOf(codeClass); if (isExcluded !== -1) { isLanguage = -1; } if (isLanguage !== -1) { var button = document.createElement("button"); button.className = "copy-button"; button.textContent = "Copy"; pre[i].appendChild(button); hasLanguage = true; } }; if (hasLanguage) { var copyCode = new ClipboardJS(".copy-button", { target: function(trigger) { return trigger.previousElementSibling; } }); copyCode.on("success", function(event) { event.clearSelection(); event.trigger.textContent = "Copied"; window.setTimeout(function() { event.trigger.textContent = "Copy"; }, 2000); }); } }); })(jQuery); </script> <!-- 自定义js代码 统计代码 --> <script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?45ec3fdb43eed1e6d14ca87b5a622d1a"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); document.addEventListener('copy', function (event) { let clipboardData = event.clipboardData || window.clipboardData; if (!clipboardData) { return; } let text = window.getSelection().toString(); if (text) { event.preventDefault(); clipboardData.setData('text/plain', text + '\n--------------------------------------------------\n版权声明:未经授权,禁止私自复制、盗取、采集、转载到其他平台。\n本文链接:' + window.location.href + '\n--------------------------------------------------'); } }); })(); </script> <!-- 自定义js代码 统计代码 END --> </body> </html>