Spring-webmvc源码解析之ResourceHttpRequestHandler

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 基于4.1.7.RELEASE该类继承了WebContentGenerator,WebContentGenerator可以对response进行设置header,设置缓存时间等操作,并且提供了对request的method的检查功能。

基于4.1.7.RELEASE


该类继承了WebContentGenerator,WebContentGenerator可以对response进行设置header,设置缓存时间等操作,并且提供了对request的method的检查功能。

ResourceHttpRequestHandler 在xml文件中的配置方法

<mvc:resources mapping="/images/**" location="/images/" />

当spring检测到这样的配置,启动时会在SimpleUrlHandlerMapping中将mapping中的值与ResourceHttpRequestHandler映射起来,当有mapping对应的请求进来时,spring会将请求转给ResourceHttpRequestHandler处理


可以通过外界来设置其需要处理的locations和resourceResovlers,主要是通过下面这两个方法

public void setLocations(List<Resource> locations) {
   Assert.notNull(locations, "Locations list must not be null");
   this.locations.clear();
   this.locations.addAll(locations);
}
public void setResourceResolvers(List<ResourceResolver> resourceResolvers) {
   this.resourceResolvers.clear();
   if (resourceResolvers != null) {
      this.resourceResolvers.addAll(resourceResolvers);
   }
}

从构造函数中可以看出

public ResourceHttpRequestHandler() {
   super(METHOD_GET, METHOD_HEAD);
   this.resourceResolvers.add(new PathResourceResolver());
}

在处理resourceResovlers时,默认会配置一个PathResourceResolver,如果是指定Resolvers列表,spring建议将PathResourceResolver放在列表中最后一个。那么PathResourceResolver是干什么的呢?来看看它的注释(已删除无关注释)

/**
 * A simple {@code ResourceResolver} that tries to find a resource under the given
 * locations matching to the request path.
 */

public class PathResourceResolver extends AbstractResourceResolver 

注释里讲明了这个类会在request请求来时,根据request的path尝试在配置好的locations中寻找对应的资源。那么它是怎么判断是否是对应的资源呢?

后面ResourceResolver会讲到。

下面我们来看handlerRequest方法,这个方法会对response返回3种情况

404 : 检查请求的资源是否在配置列表中?如果请求的资源不在列表中则返回404。

304 : 请求的资源已存在配置列表中,但是请求header中的last-modified参数比资源的last-modified的时间戳新,则返回304。

返回数据 : 请求的header时间戳比资源时间戳旧,或者header中没有last-modified,那么返回正常数据并设置header缓存为1年。

@Override
public void handleRequest(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {

   checkAndPrepare(request, response, true);

   // 检查请求路径与资源文件对应关系
   Resource resource = getResource(request);
   if (resource == null) {
      response.sendError(HttpServletResponse.SC_NOT_FOUND);
      return;
   }

   // check the resource's media type
   MediaType mediaType = getMediaType(resource);
   //代码已简洁 作用为log日志mediaType是否存在

   // 检查时间戳  会给response设置304
   if (new ServletWebRequest(request, response).checkNotModified(resource.lastModified())) {
      logger.trace("Resource not modified - returning 304");
      return;
   }
   setHeaders(response, resource, mediaType);

   // http method 方法
   if (METHOD_HEAD.equals(request.getMethod())) {
      logger.trace("HEAD request - skipping content");
      return;
   }
   //将资源内容写入response的outPutStream
   writeContent(response, resource);
}


目录
相关文章
|
22小时前
|
Java Spring
Spring底层架构源码解析(三)
Spring底层架构源码解析(三)
|
22小时前
|
XML Java 数据格式
Spring底层架构源码解析(二)
Spring底层架构源码解析(二)
|
1天前
|
算法 Java 程序员
Map - TreeSet & TreeMap 源码解析
Map - TreeSet & TreeMap 源码解析
7 0
|
1月前
|
存储 缓存 Java
什么是线程池?从底层源码入手,深度解析线程池的工作原理
本文从底层源码入手,深度解析ThreadPoolExecutor底层源码,包括其核心字段、内部类和重要方法,另外对Executors工具类下的四种自带线程池源码进行解释。 阅读本文后,可以对线程池的工作原理、七大参数、生命周期、拒绝策略等内容拥有更深入的认识。
102 29
什么是线程池?从底层源码入手,深度解析线程池的工作原理
|
1月前
|
开发工具
Flutter-AnimatedWidget组件源码解析
Flutter-AnimatedWidget组件源码解析
157 60
|
1月前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
267 37
|
2天前
|
存储 Java API
从源码角度解析ArrayList.subList的几个坑!
从源码角度解析ArrayList.subList的几个坑!
|
12天前
|
Java Spring 容器
Spring IOC、AOP与事务管理底层原理及源码解析
【10月更文挑战第1天】Spring框架以其强大的控制反转(IOC)和面向切面编程(AOP)功能,成为Java企业级开发中的首选框架。本文将深入探讨Spring IOC和AOP的底层原理,并通过源码解析来揭示其实现机制。同时,我们还将探讨Spring事务管理的核心原理,并给出相应的源码示例。
50 9
|
9天前
|
存储 编译器 C++
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
29 2
|
26天前
|
编解码 开发工具 UED
QT Widgets模块源码解析与实践
【9月更文挑战第20天】Qt Widgets 模块是 Qt 开发中至关重要的部分,提供了丰富的 GUI 组件,如按钮、文本框等,并支持布局管理、事件处理和窗口管理。这些组件基于信号与槽机制,实现灵活交互。通过对源码的解析及实践应用,可深入了解其类结构、布局管理和事件处理机制,掌握创建复杂 UI 界面的方法,提升开发效率和用户体验。
113 12

推荐镜像

更多