您的位置 首页 > 德语词汇

fileserve是什么意思?用法、例句,Tomcat处理静态文件DefaultServlet分析

大家好,今天来为大家解答fileserve是什么意思?用法、例句这个问题的一些问题点,包括Tomcat处理静态文件DefaultServlet分析也一样很多人还不知道,因此呢,今天就来为大家分析分析,现在让我们一起来看看吧!如果解决了您的问题,还望您关注下本站哦,谢谢~

问题的起因是,用网页打开tomcat7服务器上一个只有静态内容的jsp页面,里面链接了gif文件,F5刷新的时候,css和gif文件请求返回304notMofified头,而jsp请求还是返回200(想搞破坏,把jsp也可以在通过304返回头直接读取客户端缓存,但jsp是servlet只能在servlet容器中运行。。。)

fileserve是什么意思?用法、例句,Tomcat处理静态文件DefaultServlet分析

因为jsp文件请求时tomcat的JspServlet处理的,而css和html、gif等静态文件默认是tomcat的DefaultServlet处理的(在tomcat配置文件conf/web.xml中有配置)。

先来看下tomcat7的DefaultServlet的源码:

服务端通过resource.lookupCache(path)从服务端缓存中读取资源获得CacheEntry,如果请求资源不存在CacheEntry.exists为false,则返回404。然后通过checkIfHeaders(request,response,cacheEntry.attributes)方法根据客户端请求头的If-None-Match,If-Modified-Since来判断请求资源是否被修改,如果未被修改,则返回304头,户端直接从客户端缓存中读取资源文件。如果第一次访问或者ctrl+F5强制刷新或者资源已修改过,默认返回Etag和Last-Modified头,,告知客户端下次访问可以通过If-None-Match,If-Modified-Since比较返回304来判断是否可使用客户端缓存。还有设置文件内容,content-length,range头等,最后输出内容:

if(!checkSendfile(request,response,cacheEntry,contentLength,null))

copy(cacheEntry,renderResult,ostream);

如果文件超过48k,判断是否使用sendfile来输出大文件。

请求头中通过range请求部分下载,则:

if(!checkSendfile(request,response,cacheEntry,range.end-range.start+1,range))

copy(cacheEntry,ostream,range);

首先从存在的资源缓存cache中查找,未找到则从不存在的资源的缓存notFoundCache中查找。如果找到,检查缓存是否有效。cache默认有效期5秒,5秒之内不检查原文件是否有修改,超过有效期,需要验证原文件的lastModified和ContendLenth和缓存中的是否一致,不一致清除缓存,一致则更新缓存的timestap再次5秒有效期。(这样的话,如果修改css或js等静态文件,如果测试的人一直访问(5秒间隔内)这个页面,导致静态文件一直从服务端缓存中读取,那样无论是否强制刷新修改都不会生效啊。)未找到则生成CacheEntry,加载到相应的cache或notFoundCache中。当然,nonCacheable数组默认/WEB-INF/lib/,/WEB-INF/classes/路径下文件都不从缓存获取。这里cache缓存设计成一个有序数组,而notFoundCache设计为一个HashMap,cache操作稍微复杂点。难道是因为cache释放内存需要更细粒度的控制?

END,本文到此结束,如果可以帮助到大家,还望关注本站哦!

本站涵盖的内容、图片、视频等数据,部分未能与原作者取得联系。若涉及版权问题,请及时通知我们并提供相关证明材料,我们将及时予以删除!谢谢大家的理解与支持!

Copyright © 2023