真正“搞”懂HTTP协议08之重定向

  我们知道,用来传输页面的协议就是HTTP协议,全称是超文本传输协议,而浏览器展示的页面则是用HTML编写的,HTML的全称则是超文本标记语言。你看,都叫做超文本,我在第一篇文章的时候也详细的聊过,超文本区别于文本的本质就是文本中具有超链接的文本。

  当我们点击页面中的超链接,则会跳转到其它超文本页面,对于线性传统结构的文档,是一个根本性的变革。

一、重定向的基本概念和场景

  点击超链接后,浏览器会解析URL,再用这个URL发起一个新的HTTP请求,跳转到其它页面。这样的跳转动作,是由浏览器的使用者发起的,这种跳转叫做“主动跳转”,但是还有一类跳转,是由服务器发起的,浏览器使用者无法控制,也就是“被动跳转”,被动跳转在HTTP中有一个专有的名词,叫做重定向

  重定向的使用场景其实并不少,比如,多个域名指向一个统一的页面。我们可以在浏览器里打开一个新的tab标签,然后输入http://www.baidu.com,看一下,什么效果?

   我们发现会优先有两个请求,一个307,一个200。我们来看下详细的内容:

 

   我们看下,其实并不复杂,就是重定向到http协议的域名。

  嗯……这就是一个比较常见的重定向场景之一。再比如一些资源的更新,旧的不用了,但是为了不去修改HTML资源访问的代码,紧急解决一些问题,就可以由服务器更改,重定向到新的资源页面。

  详细的内容,我们在后续的讲解和例子中再深入的学习。

二、重定向涉及到的头字段和状态码

  我们要聊的字段其实不多,就一个,就是Location字段,Location字段可以接受绝对地址或者相对地址作为该字段的值,如果是相对地址的话,则会从响应报文的上下文中获取相应的信息,拼出完整的重定向地址。如果重定向只是在站内跳转,比如www.zaking.com跳转到www.zaking.com/index.html,那你可以随便用,但是如果你要跳到别的站点,比如从www.zaking.com跳转到www.baidu.com,则必须使用完整的绝对地址。

  涉及到重定向的状态码则比较多了,我们要能准确地区分出不同的3xx状态码代表的含义。最常见的状态码就是301、302,还有比如303,304,305,306,307我们稍微了解下,注意其语义的区别即可。

  首先,301状态码的意思是Moved Permanently,也就是永久重定向,意味着你访问的资源已经不存在了,今后所有的请求都要使用新的URI。当浏览器看到301状态码时,就知道原来的URI已经过时了,会适当的做一些优化。比如历史记录,更新书签,下次访问的时候,就不会再往旧地址发送请求了。而搜索引擎看到301,也会更新索引库,不会在去爬原来的地址了。

  当然,这里你要知道的就是,这些一切的优化也好,更新也罢,其实都是终端针对协议所做的应用层面的操作。比如,浏览器会根据301来进行优化,搜索引擎也会根据301来实现更新策略,那浏览器不实现行不行?搜索引擎也不做这些额外的无聊的操作,肯定都是可以的~~

  接下来我们说说302,是指临时重定向,也就是说你访问的地址暂时不能用了,先去新的地址访问资源吧。但由于是临时重定向,浏览器也好,搜索引擎也好,还是其它的啥啥也好,都不会做什么优化和更新,只是做个重定向的操作就完事了。

  那么我们再来看看其它的不常用的状态码:

  1. 303,没啥用~意思是See Other,参见其它的意思,但要求重定向后的请求改为 GET 方法,访问一个结果页面,避免 POST/PUT 重复操作;。其实302做的事情,跟303一样,用302就行了。
  2. 304,未修改,Not Modified,如果客户端执行了一个有条件的Get请求,但是请求的资源并没有修改,则会返回304。有条件的Get请求,其实就是指那些带有If-开头的头字段,需要根据这些字段进行一些其它的逻辑处理。了解下就行啦。
  3. 305,Use Proxy,所提供的Location字段的值必须是一个代理服务器的地址。
  4. 306,废弃了。不用管
  5. 307,Temporary Redirect,类似 302,但重定向后请求里的方法和实体不允许变动,含义比 302 更明确。

  所以你看,除了301和302以外,其它大多数的字段要么场景分的更细,实践的时候大多数都由302处理了,要么就废弃了。我们熟悉301和302就足够了。

三、重定向的应用场景

  我们之前在聊状态码的时候,强调了301和302的重要性,换句话就是说,其实重定向可以粗略、简单、明了的理解为永久和临时的区别。那么针对重定向的使用场景,实际上也是基于永久和临时的区别和特点来实践的。

  那什么时候需要重定向呢?一个最常见的原因就是“资源不可用”,我们需要提供一个新资源的URI来进行后续的使用。至于不可用的原因那就种类繁多千变万化了,比如服务器维护,为了用户使用不受到影响,则会重定向到一个临时的页面,供用户访问。

  另一个原因就是增加访问入口,让多个名字类似的域名指定到同一个主站,增加访问的入口同时还不会增加什么工作量。

  在确定了重定向的场景后,要考虑的就是临时还是永久了。那么针对我们上面提到的两种场景,要用临时还是永久呢?

四、例子

  我们聊完了重定向的核心概念,接下来我们就来写一写例子,在实际的代码实验中,体验下301和302的区别。按照惯例,基本的代码我就不贴在这里了,我只贴核心的部分了噢。首先,我们先来看看永久重定向:

if (parsedUrl.pathname == "/301") {
  let sourceCode = fs.readFileSync(
    path.resolve(__dirname, "./index.html"),
    "utf8"
  );
  res.writeHead(301, {
    Location: "http://www.zaking.com:9001/redirect",
  });
  res.end(sourceCode);
}

  其实就真的很简单,我感觉没啥说的。302的也一样,把上面的头字段改成302就好了。我感觉这例子不用写,结果我就不展示了,大家有兴趣可以自己试下,我们来看点不一样的:

   看到区别么?301永久重定向,如果你不做缓存的设置,那么浏览器会默认缓存原地址,因为浏览器认为你的重定向是永久的,我直接缓存就好了,而302临时重定向的话,浏览器压根不会缓存,因为觉得这个地址以后还要用,缓存也没用。我们再来看个例子:

// 死循环了
if (parsedUrl.pathname == "/cycle") {
  let sourceCode = fs.readFileSync(
    path.resolve(__dirname, "./cycle.html"),
    "utf8"
  );
  res.writeHead(302, {
    Location: "http://www.zaking.com:9001/back",
  });
  res.end(sourceCode);
}
if (parsedUrl.pathname == "/back") {
  let sourceCode = fs.readFileSync(
    path.resolve(__dirname, "./back.html"),
    "utf8"
  );
  res.writeHead(302, {
    Location: "http://www.zaking.com:9001/cycle",
  });
  res.end(sourceCode);
}

  代码没啥哈,重点在于循环跳转,直接造成浏览器压根没法用:

   这是重定向需要尤其注意的问题,咱们现在的重定向链路十分简单,就两个页面来回跳,当你写了复杂的服务器逻辑的时候,很难确定是否会有循环链路的重定向的问题的。

五、总结

  其实关于重定向,最核心的就是301和302了,大家一定要会,没啥好说的。重定向在一定程度上提供了一定场景下的应用解决方案,但是其实也会带来一定的问题,比如,只要重定向就一定会发送一次额外的请求,造成性能的浪费。另外要格外注意的就是循环跳转的问题。

  本篇的东西不多,那就到这里啦,学习这么无聊,下一篇我们来吃点点心。

本文来自博客园,作者:Zaking,转载请注明原文链接:http://www.cnblogs.com/zaking/p/17041481.html

本文转载于网络 如有侵权请联系删除

相关文章

  • 使用Rsync和Nginx创建Rocky Linux 8.3 RC1本地存储库镜像

    文章声明:此文基于木子实操撰写 生产环境:RockyLinuxrelease8.3,Nginx1.14.1 问题关键字:使用Rsync和Nginx创建RockyLinux8.3RC1本地存储库镜像前述木子本打算写一篇在RockyLinux8.3RC1上安装Nginx的基础博文,感觉一两条命令,也没有什么太多好写的,而且今天刚好在做RockyLinux8.3RC1本地存储库镜像,正好需要使用Nginx,所以就顺道写了这篇博文。配置本地存储库镜像目录因为存储库镜像都比较大,所以一般需要单独创建一个磁盘用于存放对应文件,所以这里单独挂载了一个100GB的磁盘,用于存储仓库镜像。#初始化磁盘 [root@localhost~]#mkfs.xfs/dev/sdb #创建本地仓库目录 [root@localhost~]#mkdir-p/data #挂载磁盘 [root@localhost~]#mount/dev/sdb/data #创建rocky源目录 [root@localhost~]#mkdir-p/data/repos/rocky #查看磁盘UUID [root@localhost~

  • Netty核心接口源码之ReferenceCounted

    位于netty自己的工具包下 一个引用计数的对象,需要显式取消分配。当实例化一个新的ReferenceCounted时,它从引用计数1开始。retain引用计数加一 release引用计数减一。如果引用计数减到0,则将显式释放对象,并且访问该释放对象通常会导致访问冲突。 如果实现ReferenceCounted的对象是其他实现ReferenceCounted的对象的容器,则当容器的引用计数变为0时,包含的对象也将通过release释放。APIintrefCnt()返回对象的引用计数.如果返回0,意味着对象已经被回收. ReferenceCountedretain()将引用计数增加1 ReferenceCountedretain(intincrement)将引用计数增加指定数量 booleanrelease()将引用计数减一,如果引用计数达到0则回收这个对象.注意:返回的boolean值,当且仅当引用计数变成0并且这个对象被回收才返回true. booleanrelease(intdecrement)同上,将引用计数减少指定数量 ReferenceCountedtouch(Objecth

  • 希望涨工资?看看能为运维人带来更高收入的十大技术!

    写公众号以来,一直不断的有人在后台或私下微信我,民工哥,运维现在有前「钱」途不?不会开发是不是就会被淘汰?其实,这些问题大可不必关心,任何一门技术,只需要掌握它的重点,继而再扩展相关的广度与深度,然后再在工作中加以应用实践与自我总结,我相信你都会学会,并且也能取得好的成绩「拿高薪肯定也不是问题」。前言:Linux基金会和在线求职招聘网站Dice发布了一份关于开源招聘的调查结。结果显示,相对于其他类型的IT工作者,67%的管理人员更希望雇佣在开源技术方面有所专长的技术人员。所以,哪些开源技术是需求最高的?1.云和虚拟化当被问及到现在最需要哪些开源技能时,70%的招聘主管提到了云计算技术,如OpenStack和CloudFoundry。2016年有66%的招聘主管有过同样的表示,所以可以看到,对云计算技术的需求持续在增长。同样的,62%的雇主表示,“云”是最影响他们招聘决策的技术。IT专业人士还将云计算视为最抢手的技术之一,47%的受访者表示非常重要,69%的专业人士表示,他们希望云技术在明年变得更加重要。RobertHalf薪资指南仅列出了一个与云相关的职位。它表示,云计算分析师的收入中

  • Linux环境变量的设置和查看方法

    1.显示环境变量HOME$echo$HOME /home/redbooks复制2.设置一个新的环境变量hello$exportHELLO="Hello!" $echo$HELLO Hello!复制3.使用env命令显示所有的环境变量$env HOSTNAME=redbooks.safe.org PVM_RSH=/usr/bin/rsh Shell=/bin/bash TERM=xterm HISTSIZE=1000 ...复制4.使用set命令显示所有本地定义的Shell变量$set BASH=/bin/bash BASH_VERSINFO=([0]="2"[1]="05b"[2]="0"[3]="1"[4]="release"[5]="i386-redhat-linux-gnu") BASH_VERSION='2.05b.0(1)-release' COLORS=/etc/DIR_COLORS.xterm COLUMNS=80

  • Vue.js 组件编码规范

    目标本规范提供了一种统一的编码规范来编写Vue.js代码。这使得代码具有如下的特性:其它开发者或是团队成员更容易阅读和理解。IDEs更容易理解代码,从而提供高亮、格式化等辅助功能更容易使用现有的工具更容易实现缓存以及代码包的分拆本指南为DeVoorhoede参考RiotJS编码规范而写。基于模块开发始终基于模块的方式来构建你的app,每一个子模块只做一件事情。Vue.js的设计初衷就是帮助开发者更好的开发界面模块。一个模块是应用程序中独立的一个部分。怎么做?每一个Vue组件(等同于模块)首先必须专注于解决一个单一的问题,独立的、可复用的、微小的和可测试的。如果你的组件做了太多的事或是变得臃肿,请将其拆分成更小的组件并保持单一的原则。一般来说,尽量保证每一个文件的代码行数不要超过100行。也请保证组件可独立的运行。比较好的做法是增加一个单独的demo示例。Vue组件命名组件的命名需遵从以下原则:有意义的:不过于具体,也不过于抽象简短:2到3个单词具有可读性:以便于沟通交流同时还需要注意:必须符合自定义元素规范:使用连字符分隔单词,切勿使用保留字。app-前缀作为命名空间:如果非常通用的话

  • 【Rust问答】Box 和 Cell 之间有什么本质区别?

    Box和Cell之间的本质区别是什么?两者主要的应用场景为何?通过一些搜索和文档阅读,我了解到两者确实有很多不同点,但是我一直没有找到对于“本质区别”这个概念的合理解答。一些参考:https://rust.cc/article?id=37d1cb4f-5cc9-4adc-b41a-dbe4914bf4b5https://www.reddit.com/r/rust/comments/4cvc3o/what_are_cell_and_refcell_used_forhttps://users.rust-lang.org/t/confused-between-box-rc-cell-arc/10946/1------ yuanyunchang2020-01-1708:49Cell和RefCell是实现内部可变性的容器,在保持容器不被drop的情况下可以修改其中的值,而Box就做不到。作者JmPotato2020-01-1711:02感谢回答,我昨天研究了一天这个问题,写了一篇文章来记录一下,欢迎帮忙纠错。https://ipotato.me/article/57jmjoy2020-01-17

  • Vue 最黑暗的一天

    前言Vue.js现今有很多开发者使用,也有非常多的公司项目都是用vue开发,相信大家也比较关心vue今后的发展,但是现在vue.js3.0就有一个非常重要的问题,在很多论坛等炸了锅,大家可以看下面原文,了解更多vue的新动态译文 今天,我惊讶的发现,往常积极友好的VueJS社区陷入了一场激烈的战争。 两周前,Vue的创建者尤雨溪发布了一个请求意见稿(RFC),用于在即将发布的Vue3.0中使用基于函数的方式编写Vue组件。今天,一个Reddit上批评性的帖子和HackerNews上一些类似的批评性的评论,引起大批开发者涌向原本的RFC来表达他们的愤怒,其中一些有点侮辱性。 在很多地方都有人声称:所有Vue代码都必须以全新的方式重写,因为现有的语法正在被移除,并且被其他东西取代; 人们花在学习Vue上的所有时间都被浪费了,因为一切都会改变; 新语法比旧的更糟糕,因为它没有强制的结构,并且会导致意大利面条式代码; Vue核心团队在没有任何咨询的情况下突然施行一个巨大的破坏性的变化; Vue要变成React了! 不,Vue要变成AngularJS/Angular了! 所有HTML都要写在一个

  • 手把手教你实现一个引导动画

    前言最近看了一些文章,知道了实现引导动画的基本原理,所以决定来自己亲手做一个通用的引导动画类。我们先来看一下具体的效果:点这里原理通过维护一个Modal实例,使用Modal的mask来隐藏掉页面的其他元素。根据用户传入的需要引导的元素列表,依次来展示元素。展示元素的原理:通过cloneNode来复制一个当前要展示元素的副本,通过当前元素的位置信息来展示副本,并且通过z-index属性来让其在ModalMask上方展示。大致代码如下: constnewEle=target.cloneNode(true);constrect=target.getBoundingClientRect();newEle.style.zIndex='1001';newEle.style.position='fixed';newEle.style.width=`${rect.width}px`;newEle.style.height=`${rect.height}px`;newEle.style.left=`${rect.left}px`;newEle.style.top=

  • Docker生态系统系列之网络和通信

    编者按:网络一直是Docker集群中的最令人头疼的问题,目前Docker已经收购了SocketPlane团队来解决相关问题,也发布了libnetwork项目。本文介绍了Docker生态中的网络解决方案,包括Docker原生网络功能,以及其它辅助项目。 简介 当使用Docker容器构建分布式服务时,通信和网络变得非常重要。面向服务的架构严重依赖节点之间的通信。 在这篇文章中,我们将讨论多种网络策略和工具用于容器所处的网络,并打造成他们所期待的状态。一些情况下可以采用Docker原生解决方案,其他情况就需要些备选方案。 Docker原生网络实现 为了实现容器到容器和容器到宿主机之间的通信,Docker本身就已经提供了几种解决方案。 当Docker进程启动之后,它会配置一个虚拟的网桥叫docker0在宿主机上。这个接口允许Docker去分配虚拟的子网给即将启动的容器们。这个网桥在容器内的网络和宿主机网络之间将作为接口的主节点。 Docker容器启动后,将创建一个新的虚拟接口并分配一个网桥子网内的IP地址。这个IP地址嵌在容器内网络中,用于提供容器网络到宿主机docker0网桥上的一个通道。D

  • 理解 Linux shell 中的一个方言:2>&1

    前言在使用linux命令或者shell编程时,这个用法常会遇到2>&1如果是刚开始接触Linux,这个东西的确不好理解,因为他没有直观的含义,不像一个命令,例如cp是copy的简写,很好记。我以前刚用Linux时就对这个东西迷糊了一段时间,今天刚好看到一篇文章介绍他,感觉很有必要总结出来,分享给还不是很理解这个方言的朋友。下面看一个命令示例,然后分析下他是如何工作的:lsfoo>/dev/null2>&1复制首先需要了解两个基础概念:I/O重定向、文件描述符I/O重定向重定向的作用是把一个命令的输出结果发送到另一个地方。例如,使用cat命令查看一个文件,文件内容会被打印到屏幕:$catfoo.txt foo bar baz复制此时,屏幕就是命令的标准输出(standardoutput【stdout】)位置。我们可以把文件内容发送到别的地方,例如,重定向到output.txt文件中:$catfoo.txt>output.txt $catoutput.txt foo bar baz复制其中第一个cat使用>把stdout的位置改为了另一个文件

  • 动态规划|相邻约束下的最优解

    本篇进一步介绍动态规划的基本应用。1题目Youareaprofessionalrobberplanningtorobhousesalongastreet.Eachhousehasacertainamountofmoneystashed,theonlyconstraintstoppingyoufromrobbingeachofthemisthatadjacenthouseshavesecuritysystemconnectedanditwillautomaticallycontactthepoliceiftwoadjacenthouseswerebrokenintoonthesamenight.Givenalistofnon-negativeintegersrepresentingtheamountofmoneyofeachhouse,determinethemaximumamountofmoneyyoucanrobtonightwithoutalertingthepolice.相邻房子不能同时偷,求在此约束下,偷n个房子获益的最大值。2分析分析以下例子:房子编号:012345房子收益:

  • 漏洞预警:Google安全研究人员发现NTP(网络时间协议)最新漏洞

    Google安全研究人员最近发现,NTP协议(网络时间协议)出现了一些新的严重漏洞,NTP4.2.8之前的版本均受影响,黑客可以利用这些漏洞展开远程攻击。NTP4.2.8以前版本均受影响NTP协议是用于计算机系统之间的一个网络时间同步协议。在NTP4.2.8之前的版本都会受到此次漏洞影响影响。更为严重的是,研究人员已经真实环境下发现了真实攻击案例以及相应的漏洞利用程序(EXP)。在这一系列NTP协议的漏洞里,包括了远程缓冲区溢出等严重问题,黑客可以轻松地将这些使用老版本NTP服务的服务器黑掉。漏洞利用程序(EXP)已在地下流传ICS-CERT(工业控制应急响应中心)顾问称:“Google安全研究小组成员NeelMehta和StephenRoettger曾与CERT/CC合作研究NTP协议的多个漏洞。由于NTP协议在工控 系统中广泛使用,NCCIC/ICS-CERT向美国重要基础设施资产管理者和客户进行预警,同时希望尽快找出修复或缓解措施。”复制漏洞可以被远程利用,漏洞利用程序(EXP)也已经在地下黑市广为流传。黑客只需要发送单一的数据包,就可以对NTP缓冲区溢出进而执行恶意代码,最后对

  • Java Mail

    importjavax.mail.Session; importjavax.mail.Transport; importjavax.mail.internet.InternetAddress; importjavax.mail.internet.MimeMessage; importjava.util.Date; importjava.util.Properties; publicclassMain{ /** *发件人的邮箱和密码 *某些邮箱服务器为了增加邮箱本身密码的安全性,给SMTP客户端设置了独立密码(有的邮箱称为“授权码”), *对于开启了独立密码的邮箱,这里的邮箱密码必需使用这个独立密码(授权码)。 */ publicstaticStringmyEmailAccount="admin@allasone.cc"; publicstaticStringmyEmailPassword="xxxxxx"; /** *发件人邮箱的SMTP服务器地址,必须准确,不同邮件服务器地址不同,一般(只是一般,绝非绝对)格式为:smtp.xxx.com

  • 秋招各大厂,必考的优先队列和堆排序

      秋招过了,春招还会远么?真实面试题:工作一年同事跳槽,去某为,就考了一道:用数组实现堆排序,下面就来介绍一下堆排序的实现  堆和优先队列   堆的定义  n个元素的序列k={k0,k1,……,kn-1},当且仅满足条件 (1)ki>=k2i+1和ki>=k2i+2     (2)ki<=k2i+1和ki<=k2i+2 (1)称为大根堆(2)称为小根堆 可以把堆看成完全二叉树。   优先队列 优先队列是一种常见的抽象数据类型,它与"队列"不同,不遵循"先进先出"原则,而遵循"最大元素先出"原则,出队和优先级有关。  优先队列的基本操作有三个: (1)向优先队列里插入一个元素 (2)在优先队列找出最大元素 (3)删除优先队列中最大元素 可以用堆来实现优先队列  二叉堆     最大堆定义   堆中任一节点总是大于其父节点的值,堆总是一颗完全二叉树,本篇博客以实现最大堆为主   数组实现二叉堆   用二叉树来实现堆,是比较好的,也可以用二叉树的左右指针来实现,但这种太麻烦;因为是完全二叉树,所以也可以用数

  • 编写高性能的Lua代码

    编写高性能的Lua代码 Postedon2014/04/18· 10 Comments 前言 Lua是一门以其性能著称的脚本语言,被广泛应用在很多方面,尤其是游戏。像《魔兽世界》的插件,手机游戏《大掌门》《神曲》《迷失之地》等都是用Lua来写的逻辑。 所以大部分时候我们不需要去考虑性能问题。Knuth有句名言:“过早优化是万恶之源”。其意思就是过早优化是不必要的,会浪费大量时间,而且容易导致代码混乱。 所以一个好的程序员在考虑优化性能前必须问自己两个问题:“我的程序真的需要优化吗?”。如果答案为是,那么再问自己:“优化哪个部分?”。 我们不能靠臆想和凭空猜测来决定优化哪个部分,代码的运行效率必须是可测量的。我们需要借助于分析器来测定性能的瓶颈,然后着手优化。优化后,我们仍然要借助于分析器来测量所做的优化是否真的有效。 我认为最好的方式是在首次编写的时候按照最佳实践去写出高性能的代码,而不是编写了一堆垃圾代码后,再考虑优化。相信工作后大家都会对事后的优化的繁琐都深有体会。 一旦你决定编写高性能的Lua代码,下文将会指出在Lua中哪些代码是可以优化的,哪些代码

  • ICPC EC-Final游记/退役划水(17)

    前言     你们真的好能颓啊!怎么就写了两行就有上百阅读量了( 于是重新开了一篇来写,就当刷新一下评论区了 (退役划水cnt强行++) 背景 其实我本来是有小学期课的,一看赛程,要耽误3天的课 于是去问老师,老师说作业必须线下交,然后作业会给3天的DDL 行吧,大不了去之前和去之后忙一点把作业肝了 后来发现我们晚一天才回来,这时候我就不是很想去了 算了算了,还是去吧,拖一天DDL扣10%的分我也认了 后来机票已经买好了,要出发前突然想起来一件事 从外省回学校要隔离3天不能进校 但反正说啥也已经来不及了,只能为了这耽误的7天白发愁 其实这时候对ACM的态度已经不是很好了:学校里一堆神仙,而且还有好多大二大三大四大五的学长还在打 然后我们队配合又不行,感觉再打一两年也费劲能出线(出线的先决条件是全校第一) 我们队的现状… 队长(szb)是大二的,但是酷爱卷文化课,然后做题也很不靠谱,经常出现一道题爆二三十发 不怎么做思维题,写代码经常出bug一调就要占两小时的机时(然后我和另一个队友就发两个小时呆) 喜欢打表找规律,喜欢QJ测试点,喜欢随机化,喜欢猜想和尝试 经典

  • FTU几种保护逻辑研究

    三段式电流保护 三段式定时限过流保护其中各段动作电流定值和动作时间定值可独立设定,各段过流保护都采用相同的动作判别逻辑,动作出口条件为: 为第N段电流定值 三段保护投入 延时时间到 三段保护软压板投入,三相电流最大值大于Idz(设定N段过流定值),延时T1(N段过流延时时间)时间到,三段定值保护动作,设备上传事件、显示故障、记录事件,根据过流故障动作软压板是否投入执行跳闸动作。 后加速保护 在手动合闸和过流加速保护过程中,为了使重合闸正常运行和保障系统不会长时间重合于故障,都可能会用到该功能,过流加速选择后加速方式,即在重合闸后进行加速段保护逻辑的判别,加速保护的动作条件为: 后加速保护软压板投入 开关由分闸到合闸 过流型重合闸或者失压型重合闸后,在后加速开放时间内检测到线路中任意电流值超过加速段保护的预先整定值Ijs,并且达到延时Tjs后,开关动作 注:Tjs为加速段保护的时间设定值,与后加速开放时间不同,后加速开放时间是指过流加速段时间作用的时间段。 后加速闭锁合闸(禁止合闸动作)动作条件为: (1)投入过流加速动作后闭锁合闸控制软压板 (2)过流后加速动作,且未

  • 腾讯视频qlv格式转换MP4普通视频方法

    QLV格式视频不是那么好对付的,似乎是一种加密格式,试着把.qlv改成.mp4或.flv都没有用,用格式工厂等转换软件转换也根本无法识别。但这并不意味着没有办法,其实真正的方法是不用任何工具: 1,我们要显示隐藏文件。在计算机-文件夹选项中,显示隐藏的文件、文件夹和驱动器;2,进入视频的节目缓存文件夹,在“vodcache”隐藏属性的文件夹下,可以看到许多.tdl文件,它们是视频的分段文件;3,在Windows开始按钮搜索栏中,键入“cmd”,确定并进入,输入e:回车,再输入命令“copy/b*.tdl1.mp4”对这些*.tdl文件进行合并(文件名可以自行设置),很快就可以得到一个MP4格式的视频文件。 经测试这个MP4文件是普通视频文件,可正常播放。 工具/原料 腾讯视频客户端 方法/步骤     下载视频客户端。   安装成功后,搜索你想要的视频,点击播放。如图搜索:军营版《小苹果》,等待视频播放完毕。   在客户端界面右上角,点击向下箭头按钮,弹出如下图中所示的菜单,然后点击设置选项。

  • react+antd pro实现【列表可实时行内编辑】的弹窗表单组件

    纯列表版效果展示: ① 初始无值,展示为唤醒按钮+文案外链   ②点击按钮唤醒弹窗(简易版示意图)    ③配置后     可编辑表格组件文档: https://procomponents.ant.design/components/editable-table   纯列表组件代码: 表单引用: //antd-pro的高级表单组件 importSchemaFormfrom'@/components/SchemaForm'; importAssetsTablefrom'./AssetsTable'; --------------------------------------- <SchemaForm<API.AssetsProps> formRef={formRef} dataSource={dataSource.map((item:any)=>{ if(item.id==='event_asset'){ return{ ...item, required:'请配置事件资产', f

  • ios中将事件添加到系统日历

    -(void)saveEvent:(id)sender{ //事件市场 EKEventStore*eventStore=[[EKEventStorealloc]init]; //6.0及以上通过下面方式写入事件 if([eventStorerespondsToSelector:@selector(requestAccessToEntityType:completion:)]) { //theselectorisavailable,sowemustbeoniOS6ornewer [eventStorerequestAccessToEntityType:EKEntityTypeEventcompletion:^(BOOLgranted,NSError*error){ dispatch_async(dispatch_get_main_queue(),^{ if(error) { //错误细心 //displayerrormessagehere } elseif(!granted) { //被用户拒绝,不允许访问日历 //displayaccessdeniederrormessageh

  • sql去重并统计总数

    --根据某个字段去重后获取总数 SELECTCOUNT(DISTINCT去重字段)FROMtable复制  

相关推荐

推荐阅读