网站维护进不去怎么办网站服务器ip

diannao/2025/10/22 21:32:34/文章来源:
网站维护进不去怎么办,网站服务器ip,9951026企业邮箱888,江苏城嘉建设工程有限公司网站客户端缓存是万维网的基础之一。 服务器应告知客户端资源的有效性#xff0c;客户端应尽可能快地对其进行缓存。 如我们所见#xff0c;如果不缓存Web#xff0c;将会非常慢。 只需在任何网站上Ctrl F5并将其与普通F5进行比较-后者就会更快#xff0c;因为它使用了已缓存的… 客户端缓存是万维网的基础之一。 服务器应告知客户端资源的有效性客户端应尽可能快地对其进行缓存。 如我们所见如果不缓存Web将会非常慢。 只需在任何网站上Ctrl F5并将其与普通F5进行比较-后者就会更快因为它使用了已缓存的资源。 缓存对于下载也很重要。 如果我们已经获取了几兆字节的数据并且它们没有改变则通过网络推送它们是非常浪费的。 使用 HTTP ETag标头可用于避免重复下载客户端已有的资源。 服务器与第一响应服务器一起返回ETag标头该标头通常是文件内容的哈希值。 客户端可以保留ETag并在以后请求相同资源时将其发送在If-None-Match请求标头中。 如果在此期间未更改则服务器可以简单地返回304 Not Modified响应。 让我们从对ETag支持的集成测试开始 def should send file if ETag not present() {expect:mockMvc.perform(get(/download/ FileExamples.TXT_FILE_UUID)).andExpect(status().isOk())}def should send file if ETag present but not matching() {expect:mockMvc.perform(get(/download/ FileExamples.TXT_FILE_UUID).header(IF_NONE_MATCH, WHATEVER)).andExpect(status().isOk()) }def should not send file if ETag matches content() {given:String etag FileExamples.TXT_FILE.getEtag()expect:mockMvc.perform(get(/download/ FileExamples.TXT_FILE_UUID).header(IF_NONE_MATCH, etag)).andExpect(status().isNotModified()).andExpect(header().string(ETAG, etag)) } 有趣的是Spring框架中内置了ShallowEtagHeaderFilter 。 安装它会使所有测试通过包括最后一个测试 WebAppConfiguration ContextConfiguration(classes [MainApplication]) ActiveProfiles(test) class DownloadControllerSpec extends Specification {private MockMvc mockMvcAutowiredpublic void setWebApplicationContext(WebApplicationContext wac) {mockMvc MockMvcBuilders.webAppContextSetup(wac).addFilter(new Sha512ShallowEtagHeaderFilter(), /download/*).build()}//tests...} 我实际上插入了使用SHA-512而不是默认MD5的自己的Sha512ShallowEtagHeaderFilter 。 同样由于某种原因默认实现在哈希值前面加上0 public class ShallowEtagHeaderFilter {protected String generateETagHeaderValue(byte[] bytes) {StringBuilder builder new StringBuilder(\0);DigestUtils.appendMd5DigestAsHex(bytes, builder);builder.append();return builder.toString();}//... } 与 public class Sha512ShallowEtagHeaderFilter extends ShallowEtagHeaderFilter {Overrideprotected String generateETagHeaderValue(byte[] bytes) {final HashCode hash Hashing.sha512().hashBytes(bytes);return \ hash \;} } 不幸的是我们无法使用内置过滤器因为它们必须首先完全读取响应主体才能计算ETag 。 这基本上关闭了上一篇文章中介绍的主体流传输–整个响应都存储在内存中。 我们必须自己实现ETag功能。 从技术上讲 If-None-Match可以包含多个ETag值。 但是谷歌浏览器和ShallowEtagHeaderFilter支持它因此我们也将跳过它。 为了控制响应头我们现在返回ResponseEntityResource RequestMapping(method GET, value /{uuid}) public ResponseEntityResource download(PathVariable UUID uuid,RequestHeader(IF_NONE_MATCH) OptionalString requestEtagOpt) {return storage.findFile(uuid).map(pointer - prepareResponse(pointer, requestEtagOpt)).orElseGet(() - new ResponseEntity(NOT_FOUND)); }private ResponseEntityResource prepareResponse(FilePointer filePointer, OptionalString requestEtagOpt) {return requestEtagOpt.filter(filePointer::matchesEtag).map(this::notModified).orElseGet(() - serveDownload(filePointer)); }private ResponseEntityResource notModified(String etag) {log.trace(Cached on client side {}, returning 304, etag);return ResponseEntity.status(NOT_MODIFIED).eTag(etag).body(null); }private ResponseEntityResource serveDownload(FilePointer filePointer) {log.debug(Serving {}, filePointer);final InputStream inputStream filePointer.open();final InputStreamResource resource new InputStreamResource(inputStream);return ResponseEntity.status(OK).eTag(filePointer.getEtag()).body(resource); } 该过程由可选的requestEtagOpt控制。 如果存在并且与客户端发送的内容匹配则返回304。否则照常发送200 OK。 本示例中介绍的FilePointer新方法如下所示 import com.google.common.hash.HashCode; import com.google.common.hash.Hashing; import com.google.common.io.Files;public class FileSystemPointer implements FilePointer {private final File target;private final HashCode tag;public FileSystemPointer(File target) {try {this.target target;this.tag Files.hash(target, Hashing.sha512());} catch (IOException e) {throw new IllegalArgumentException(e);}}Overridepublic InputStream open() {try {return new BufferedInputStream(new FileInputStream(target));} catch (FileNotFoundException e) {throw new IllegalArgumentException(e);}}Overridepublic String getEtag() {return \ tag \;}Overridepublic boolean matchesEtag(String requestEtag) {return getEtag().equals(requestEtag);} } 在这里您将看到FileSystemPointer实现该实现直接从文件系统读取文件。 关键部分是缓存标记而不是在每次请求时都重新计算标记。 上面的实现的行为符合预期例如Web浏览器不会再次下载资源。 3.使用 与ETag和If-None-Match标头类似还有Last-Modified和If-Modified-Since 。 我猜它们很容易解释第一个服务器返回Last-Modified响应标头指示给定资源的最后修改时间 duh 。 客户端缓存此时间戳并将其与后续请求一起传递给If-Modified-Since请求标头中的相同资源。 如果同时未更改资源则服务器将响应304从而节省带宽。 这是一个后备机制同时实现ETag和Last-Modified是一个很好的实践。 让我们从集成测试开始 def should not return file if wasn\t modified recently() {given:Instant lastModified FileExamples.TXT_FILE.getLastModified()String dateHeader toDateHeader(lastModified)expect:mockMvc.perform(get(/download/ FileExamples.TXT_FILE_UUID).header(IF_MODIFIED_SINCE, dateHeader)).andExpect(status().isNotModified()) }def should not return file if server has older version than the client() {given:Instant lastModifiedLaterThanServer FileExamples.TXT_FILE.getLastModified().plusSeconds(60)String dateHeader toDateHeader(lastModifiedLaterThanServer)expect:mockMvc.perform(get(/download/ FileExamples.TXT_FILE_UUID).header(IF_MODIFIED_SINCE, dateHeader)).andExpect(status().isNotModified()) }def should return file if was modified after last retrieval() {given:Instant lastModifiedRecently FileExamples.TXT_FILE.getLastModified().minusSeconds(60)String dateHeader toDateHeader(lastModifiedRecently)expect:mockMvc.perform(get(/download/ FileExamples.TXT_FILE_UUID).header(IF_MODIFIED_SINCE, dateHeader)).andExpect(status().isOk()) }private static String toDateHeader(Instant lastModified) {ZonedDateTime dateTime ZonedDateTime.ofInstant(lastModified, ZoneOffset.UTC)DateTimeFormatter.RFC_1123_DATE_TIME.format(dateTime) } 并执行 RequestMapping(method GET, value /{uuid}) public ResponseEntityResource download(PathVariable UUID uuid,RequestHeader(IF_NONE_MATCH) OptionalString requestEtagOpt,RequestHeader(IF_MODIFIED_SINCE) OptionalDate ifModifiedSinceOpt) {return storage.findFile(uuid).map(pointer - prepareResponse(pointer,requestEtagOpt,ifModifiedSinceOpt.map(Date::toInstant))).orElseGet(() - new ResponseEntity(NOT_FOUND)); }private ResponseEntityResource prepareResponse(FilePointer filePointer, OptionalString requestEtagOpt, OptionalInstant ifModifiedSinceOpt) {if (requestEtagOpt.isPresent()) {final String requestEtag requestEtagOpt.get();if (filePointer.matchesEtag(requestEtag)) {return notModified(filePointer);}}if (ifModifiedSinceOpt.isPresent()) {final Instant isModifiedSince ifModifiedSinceOpt.get();if (filePointer.modifiedAfter(isModifiedSince)) {return notModified(filePointer);}}return serveDownload(filePointer); }private ResponseEntityResource serveDownload(FilePointer filePointer) {log.debug(Serving {}, filePointer);final InputStream inputStream filePointer.open();final InputStreamResource resource new InputStreamResource(inputStream);return response(filePointer, OK, resource); }private ResponseEntityResource notModified(FilePointer filePointer) {log.trace(Cached on client side {}, returning 304, filePointer);return response(filePointer, NOT_MODIFIED, null); }private ResponseEntityResource response(FilePointer filePointer, HttpStatus status, Resource body) {return ResponseEntity.status(status).eTag(filePointer.getEtag()).lastModified(filePointer.getLastModified().toEpochMilli()).body(body); } 可悲的是习惯上使用Optional不再看起来不错所以我坚持使用isPresent() 。 我们同时检查If-Modified-Since和If-None-Match 。 如果两者都不匹配我们将照常提供文件。 只是为了让您了解这些标头的工作方式让我们执行一些端到端测试。 第一个要求 GET /download/4a8883b6-ead6-4b9e-8979-85f9846cab4b HTTP/1.1...HTTP/1.1 200 OKETag: 8b97c678a7f1d2e0af...921228d8eLast-Modified: Sun, 17 May 2015 15:45:26 GMT... 带有ETag后续请求已缩短 GET /download/4a8883b6-ead6-4b9e-8979-85f9846cab4b HTTP/1.1If-None-Match: 8b97c678a7f1d2e0af...921228d8e...HTTP/1.1 304 Not ModifiedETag: 8b97c678a7f1d2e0af...921228d8eLast-Modified: Sun, 17 May 2015 15:45:26 GMT... 如果我们的客户仅支持Last-Modified GET /download/4a8883b6-ead6-4b9e-8979-85f9846cab4b HTTP/1.1If-Modified-Since: Tue, 19 May 2015 06:59:55 GMT...HTTP/1.1 304 Not ModifiedETag: 8b97c678a7f1d2e0af9cda473b36c21f1b68e35b93fec2eb5c38d182c7e8f43a069885ec56e127c2588f9495011fd8ce032825b6d3136df7adbaa1f921228d8eLast-Modified: Sun, 17 May 2015 15:45:26 GMT 有许多内置工具例如过滤器可以为您处理缓存。 但是如果您需要确保在服务器端流传输文件而不是对其进行预先缓冲则需要格外小心。 编写下载服务器 第一部分始终流式传输永远不要完全保留在内存中 第二部分标头Last-ModifiedETag和If-None-Match 第三部分标头内容长度和范围 第四部分有效地实现HEAD操作 第五部分油门下载速度 第六部分描述您发送的内容内容类型等 这些文章中开发的示例应用程序可在GitHub上找到。 翻译自: https://www.javacodegeeks.com/2015/06/writing-a-download-server-part-ii-headers-last-modified-etag-and-if-none-match.html

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

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

相关文章

广州企业网站建设开发创意交易平台官网

解题思路: 输入n3 n 0 1个 n 1 1个 n 2 2个 头1头2头3 头1 左子树0节点(个数)x右子树2个节点(个数) 头2 左子树1节点(个数)x右子树1个节点(个数) 头3 左子…

国内很多网站不是响应式宁波北京网站建设

过期策略 我们set key的时候,都可以给一个expire time,就是过期时间,指定这个key比如说只能存活1个小时,我们自己可以指定缓存到期就失效。 如果假设你设置一个一批key只能存活1个小时,那么接下来1小时后,r…

网站开发查找漏洞的工具天津市建设与管理网站

关于北京同创天成工程勘测有限公司等29家单位申报甲级测绘资质审查意见的公示  根据《中华人民共和国测绘法》和《测绘资质管理规定》《测绘资质分级标准》(国测管发〔2014〕31号),我部对北京同创天成工程勘测有限公司、北京麦格天宝科技股份有限公司、中友四达(北…

没有备案的网站怎么访问合肥网站建设 微笑互联

算法题 Leetcode 39. 组合总和 题目链接:39. 组合总和 大佬视频讲解:组合总和视频讲解 个人思路 这道组合题主要是有总和的限制,当递归和超过了总和就return,递归时加上回溯去遍历数组。 解法 回溯法 把组合问题抽象为如下树形结构 如上…

网站开发与数据库网站美工做专题尺寸多少

来源:神经科技近日,在针对健康志愿者的的一项研究中,美国国立卫生研究院(NIH)的研究人员发现,大脑可能会通过短暂的休息来巩固我们几秒钟前刚练习过的新技能的记忆。该研究结果强调了早期休息在学习中可能发…

做职业装的网站公司网站招聘费如何做会计分录

2021牛客暑期多校训练营2 题号题目知识点AArithmetic ProgressionBCannonCDraw GridsDEr Ba GameEGas StationFGirlfriendGLeague of LegendsHOlefinIPenguinsbfsJProduct of GCDsKStackLWeChat Walk

网站定制开发公司推荐wordpress资源站

nodejs中使用modbus-serial库创建Modbus TCP读取设备的数据在nodejs中安装modbus-serial库本人使用的开发环境是Windows10下的VSCode,安装并配置好了npm、node、cnpm等工具,使用cnpm安装了modbus-serial库,可以在npm中搜到modbus-serial包以及…

门户网站建设和运行招标公告双线网站选服务器

转载自 面象对象设计6大原则之六:迪米特原则迪米特原则(LOD),The Law Of Demeter,也称为最少知识原则定义一个对象应该对其他对象有最少的了解。也就是说一个类耦合和调用一个类应该知道的最少,它只关心被耦…

网站推广初期目标网站海外推广资源

国庆期间,省城HZ刚刚举行了一场盛大的集体婚礼,为了使婚礼进行的丰富一些,司仪临时想出了有一个有意思的节目,叫做"考新郎",具体的操作是这样的: 首先,给每位新娘打扮得几乎一模一样,并盖上大大的红盖头随机坐成一排; 然后,让各位新郎寻找自己的新娘.每人只准找一个,…

vs做网站开发吗绛帐做企业网站

【前沿技术杂谈:迁移学习】欧洲人工智能法案对人工智能开发者的意义 [2023 年 12 月更新] 定义、一般原则和禁止做法人工智能系统开发者基于风险的义务固定和通用人工智能开发人员(第 3/28 条)基础模型的提供者(第 28b…

深圳龙华 网站建设网站建设vipjiuselu

本节复习排序中的希尔排序,希尔排序属于插入排序。 希尔排序的代码和插入排序非常类似。 思想却相对于插入排序来说复杂。 在复习希尔排序之前, 我们需要先复习一下插入排序。 目录 插入排序 插入过程 代码实现 希尔排序 希尔排序的思想 代码实…

做加工都在哪个网站推广电商网站创办过程

英杰社区https://bbs.csdn.net/topics/617804998 一、背景 近年来,Python在数据爬取和处理方面的应用越来越广泛。本文将介绍一个基于Python的爬虫程 序,用于抓取豆瓣电影Top250的相关信息,并将其保存为Excel文件。 程序包含以下几个部…

阿里云的网站接入方式网站空间 群集

反射 反射的概念 反射机制允许程序在执行期借助于ReflectionAPI取得任何类的内部信息(比如成员变量,构造器,成员方法等等),并能操作对象的属性及方法。反射在设计模式和框架底层都会用到加载完类之后,在堆中就产生了一个Class类型…

备份wordpress网站网站建设增城

一、协议族体系结构 TCP/IP协议族分为四层协议系统,自底向下分别为数据链路层、网络层、传输层、应用层。 数据链路层常用ARP(地址解析协议)和RARP(逆地址解析协议)。在网络层使用IP寻址,而在数据链路层使用…

响应式网站的排版做定制网站多少钱

文章目录 1. 每日一言2. 题目(78)删除有序数组中的重复项2.1 解题思路2.2 代码 3. 题目(79)排序矩阵查找3.1 解题思路3.1.1 暴力查找暴力查找代码 3.1.2 二分查找二分查找代码 3.1.3 贪心贪心代码 4. 结语 1. 每日一言 水晶帘动微风起,满架蔷薇一院香。 —高骈- 2.…

注册网站法律风险专业做seo的网站

SVG是矢量图,刚接触尚不能仔细介绍,但只需记得一点:放大不失真,存储也方便。 因为多数户型图使用SVG格式,Android要用的话必须通过相关转换工具,将原SVG格式文件,转换为XML后缀的VectorDrawable…

沈阳网站做网站使用网络图片做素材 侵权

sql语句中最后多了分号的原因,去掉分号就可以。

网站设计服务流程如何注册一个自己的网址

Linux Mint 默认禁用未经验证的 Flatpak 软件包 Linux Mint 新政策 Linux Mint 项目宣布了一项新政策,即默认禁用那些未经官方验证的 Flatpak 软件包,以增强用户的安全保障。 当用户选择启用未经验证的 Flatpak 软件包时,Linux Mint 的软…

广州企业网站设计方案苏州百姓网

采购订单没有生成上传订单号pkg_inpurchase_task.p_rk_sc_rkd_zc iv_yzid ----- ZDA iv_djbh ---- KPD00014712 销售订单下传下去后直接转历史表 select * from INTERFACE_OUT_SALE_M t where djbh like %XSGYMA00220297%日志表查询结果ORA-01400: 无法将 NULL 插入 ("WMS…

网站验证码系统免费行情网站app斗印

上一篇文章学习了GIT中commit、tree和blob三个对象之间的关系,点击链接查看:【Git、GitHub、GitLab】六 GIT中commit、tree和blob三个对象之间的关系 文章目录1 git中如何删除分支2 分离头指针的情况需要注意什么1 git中如何删除分支 如何查看分支&#…