【ServletContext.getRealPath() 的输入参数要以"/"开头】事件的一些调查(一)

基本上使用ServletContext.getRealPath() 输入参数我们都会以"/"开头,不然可能发生返回值为null的错误,但是这个错误为什么发生?原因就是基于不同容器的实现不同,或者同一容器不同版本的的实现不同所产生的问题,下面仅以mac+intellij+spring4.0.0+tomcat8.0.24为例说明,其实其他的情况大体也差不多。

找到getRealPath("XXX"),通过intellij所提示的sourcecode找到的实现细节为spring-test的包中的实现,代码中其中已经避免了参数为"XXX"会发生的错误,其代码如下:

protected String getResourceLocation(String path) {

if (!path.startsWith("/")) {

path = "/" + path;

}

return this.resourceBasePath + path;

}

但是实际上,这里生效的代码并非此处所显示的代码,而是tomcat中org.apache.catalina.core包中的ApllicationContext的getRealPath方法。

这个方法在tomecat8.0.29以前是存在Bug的,尽在代码注释中写明了情况,其写到

// The WebResources API expects all paths to start with /. This is a

// special case for consistency with earlier Tomcat versions.

但是在Tomcat8.0.29以前却没有通过代码来解决,而是在参数不为空或者不以"/"开头返回null,这就导致了如标题所说的【ServletContext.getRealPath() 的输入参数要以"/"开头】的事件.

该bug在这里可以看到

https://bz.apache.org/bugzilla/show_bug.cgi?id=58228

随后在2015/3/11号的一次提交中被修复,该修复代码在15年8月发布的8.0.29版本中被发布,具体可参见

https://github.com/apache/tomcat80/blob/TOMCAT_8_0_29/java/org/apache/catalina/core/ApplicationContext.java

【ServletContext.getRealPath() 的输入参数要以"/"开头】事件第一阶段调查完毕。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 47,117评论 6 342
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,798评论 19 139
  • 最近在 Linux 下成功整合了 Tomcat 和 Apache ,其中难免踩了各种坑,在这里记录下过程以便大家学...
    王苍天阅读 5,982评论 2 10
  • 才学习完第五期的作业,感受颇多! 感恩我能有机会学习金刚智慧, 感恩父母的养育之恩!让我有了今天的存在! 感恩世间...
    京海家园阅读 2,454评论 0 0
  • 杀死一只知更鸟 《杀死一只知更鸟》,这是个黑白老电影,我无意中看了,印象特别非常深刻。该电影是60年代初自由主义先...
    米丽8316阅读 4,138评论 3 4