Tomcat 7 bug: ServletContext.getRealPath() 丢失最后一个路径分隔符

475 阅读1分钟

ServletContext.getRealPath() 用来获取某个文件夹在 Tomcat 服务器上的绝对路径,比如应用 war 包名字为 hello.war, tomcat 服务器路径为 C:\servers\apache-tomcat\ , 那么下面的代码就可以获取 WEB-INF 文件夹在磁盘上的绝对路径:

// 非 Tocmat 7
// C:\servers\apache-tomcat\webapps\hello\WEB-INF\ 
String absPath = getServletContext().getRealPath("/WEB-INF/");

但是由于 Tomcat 7 的一个 Bug,上面的代码在 Tomcat 7 中执行会丢掉最后一个文件路径分隔符(在 Windows 上为 \ , 在 Linux 上为 / ),

// Tomcat 7
// C:\servers\apache-tomcat\webapps\hello\WEB-INF
String absPath = getServletContext().getRealPath("/WEB-INF/");

如果接下来的代码中使用 absPath 进行路径拼接来访问某个文件,比如在 WEB-INF 文件夹下的 config.properties 文件,那么下面的代码在 Tocmat 7 中就会读取失败

// Tomcat 7
// C:\servers\apache-tomcat\webapps\hello\WEB-INF
String absPath = getServletContext().getRealPath("/WEB-INF/");
// C:\servers\apache-tomcat\webapps\hello\WEB-INFconfig.properties
String propAbsPath = absPath + "config.properties";