springmvc静态资源及其缓存源码流程
2024-05-15 10:54:04 3 举报
springmvc静态资源及其缓存源码流程
作者其他创作
大纲/内容
向注册中心添加资源处理器
浏览器请求
checkNotModified(resource.lastModified())
静态资源写入响应体返回给浏览器
handler.setOptimizeLocations(this.optimizeLocations)
true
遍历handlerMap找到与请求路径匹配的 pathPattern
最终进入自定义的资源配置类
否
静态资源的请求方法必须是Get 或者 Head
prepareResponse(response)
validateIfNoneMatch(etag)
获取AbstractHandlerMapping
继续执行
有缓存
静态资源写入response
每个资源处理器最终都封装在各自的ResourceHandlerRegistration 对象中
false
getHandler(processedRequest)
SimpleUrlHandlerMapping
ResourceHandlerRegistry#addResourceHandler
initApplicationContext()
this.handlerMap.get(bestMatch)
缓存检查
registry.getHandlerMapping()
for (ResourceHandlerRegistration registration : this.registrations)
implements
ResourceHttpRequestHandler#handleRequest
HttpRequestHandlerAdapter
浏览器再次请求静态资源
向web 服务器请求带 If-None-Match 请求头
Get 请求或Head 请求
访问静态资源
new ResourceHandlerRegistration(pathPatterns)
添加到资源处理器注册中心
registration.getRequestHandler()
取最匹配的 pathPattern并获取它的 handler
lastModified 基本上都是 -1
是
ResourcesConfig#addResourceHandlers
resourceHandlerMapping
1. Etag2. LastModified3. Expires4. Cache-Control...
this.registrations.add(registration)
validateIfModifiedSince(lastModifiedTimestamp)
HttpRequestHandlerAdapter#getLastModified
Etag 没有值 -> 校验 LastModified
new ResourceHttpRequestHandler()
Etag 存在?
浏览器缓存中读取
验证If-None-Match
无缓存
handler.setLocationValues(this.locationValues)
缓存协商响应头设置
创建资源请求处理器ResourceHttpRequestHandler
DispatcherServlet#doDispatch
200 或 304?
handler.afterPropertiesSet()
getResource(request)
/**/webjars/**入口
向web 服务器请求带 If-Modified-Since 请求头
DelegatingWebMvcConfiguration#addResourceHandlers
for (String registeredPattern : this.handlerMap.keySet())
由服务端决策
静态资源缓存校验
验证通过?
获取请求的静态资源的本地 Resource
遍历结束资源配置类中的所有路径映射信息都记录在 urlMap 中了
创建 SimpleUrlHandlerMapping来处理静态资源请求
确定当前请求的 handler
WebMvcAutoConfigurationAdapter#addResourceHandlers
304
ApplicationContextAware
向 web 服务端发送请求
获取资源请求handlerResourceHttpRequestHandler
验证If-Modified-Since
addResourceHandlers(registry)
registerHandlers(this.urlMap)
设置静态资源的缓存A builder for creating \"Cache-Control\" HTTP response headers.
浏览器呈现
设置静态资源的缓存时间
浏览器第一次请求静态资源
将资源处理器注册中心转成 HandlerMapping
是否过期
handler.setCacheControl(this.cacheControl)
notModified 为trueresponse 返回 304
Last-Modified?
Etag
先检查 Etag -> 有值则验证请求头中的 If-None-Match
WebMvcConfigurationSupport
getRequestHandler(registration)
handler.setLocations(this.locationsResources)
isGet || HttpMethod.HEAD.matches(method)
getHandlerAdapter(mappedHandler.getHandler())
checkRequest(request)
200
setApplicationContext
走都这里说明缓存不存在设置缓存相关的响应头主要是 cache-controller、expires
ServletWebRequest#checkNotModified(long)
lastModified > 0
handler 实现 LastModified则返回lastModified的值,否则返回-1
handler.setCacheSeconds(this.cachePeriod)
将 url path pattern 和对应的handler 关联起来
手动进行 bean 初始化操作
设置静态资源是否存在检测标记
从浏览器缓存读取静态资源
将最终匹配的 pathPattern 和 handler 都封装进HandlerExecutionChain
@BeanHandleMapping
不是 Get 也不是 Head 请求或者 checkNotModified 缓存校验失败
AbstractHandlerMapping#getHandler
静态资源的路径(字符串)
创建 bean 对象
AbstractUrlHandlerMapping#getHandlerInternal
静态资源的路径(Resource)
遍历 urlMap将 url 和 handler 的对应关系添加到handlerMap 属性中
http://192.168.50.31:8080/profile/2.jpg
收藏
0 条评论
下一页