来源:http://blog.csdn.net/gunzh/article/details/581288

Spring version:  1.2.6.

Function: To erase any './' or '../' in a path.

Note:  Windows separators ("/") are replaced by simple dashes('/').

/**
  * Normalize the path by suppressing sequences like "path/.." and
  * inner simple dots.
  * <p>The result is convenient for path comparison. For other uses,
  * notice that Windows separators ("/") are replaced by simple dashes.
  * @param path the original path
  * @return the normalized path
  */
 public static String cleanPath(String path) {
  String pathToUse = replace(path, WINDOWS_FOLDER_SEPARATOR, FOLDER_SEPARATOR);

// Strip prefix from path to analyze, to not treat it as part of the
  // first path element. This is necessary to correctly parse paths like
  // "file:core/../core/io/Resource.class", where the ".." should just
  // strip the first "core" directory while keeping the "file:" prefix.

//处理一些文件前缀。如"file:", "jndi:"等等
  int prefixIndex = pathToUse.indexOf(":");
  String prefix = "";
  if (prefixIndex != -1) {
   prefix = pathToUse.substring(0, prefixIndex + 1);
   pathToUse = pathToUse.substring(prefixIndex + 1);
  }

//分解成String token

String[] pathArray = delimitedListToStringArray(pathToUse, FOLDER_SEPARATOR);

//用于储存clean 后的path tokens
  List pathElements = new LinkedList();

//用于记录有“../”的个数
  int tops = 0;
  for (int i = pathArray.length - 1; i >= 0; i--) {

//如果是"./"当前目录,则不用处理,注意此处的if...elseif...else,使得第一个if相当于continue效果。
   if (CURRENT_PATH.equals(pathArray[i])) {
    // do nothing
   }
   else if (TOP_PATH.equals(pathArray[i])) {

//记录下“../”已出现的个数
    tops++;
   }
   else {

//如果还有“../”没被“抵消”,那么没向上走一级,则可用于“抵消”一次“../”
    if (tops > 0) {
     tops--;
    }

//如果“../”已经抵消完毕,那么走到此处,只要将token一一存起来即可,注意越高层次的token越应放得考前(其实或者刚好相反),所以每次都插在链表的头部。
    else {
     pathElements.add(0, pathArray[i]);
    }
   }
  }

//生成clean后的新的path

return prefix + collectionToDelimitedString(pathElements, FOLDER_SEPARATOR);
 }

这段代码不宜使用的情况:

1、因为是在循环体内,按照tokens的数量,逐个发现"../"并试图逐个抵消“../”,这可能会存在的一个问题是,tokens不够“抵消”。比如"/a/../../b.xml",需要抵消两次,但最多允许抵消一次(“a/”),但上述循环体内的处理对此无能为力,最终处理成为只剩下b.xml了,这肯定不是想要的结果。但有一点可以肯定的是,如果是绝对路径并且正确,就一定不会存在这个问题;但如果是相对路径,用此就需要格外小心了!或许想方设法将相对路径转为绝对路径不失为上策。

Spring StringUtils#cleanPath method 浅析相关推荐

  1. spring初始化源码浅析之代码浅析

    目录 1.refresh()简介 2.关键代码跟踪 ​2.1.obtainFreshBeanFactory()代码分析 2.2.invokeBeanFactoryPostProcessors(bean ...

  2. Spring Security 4 Method security using @PreAuthorize,@PostAuthorize, @Secured, EL--转

    原文地址:http://websystique.com/spring-security/spring-security-4-method-security-using-preauthorize-pos ...

  3. Spring Remoting: Remote Method Invocation (RMI)--转

    原文地址:http://www.studytrails.com/frameworks/spring/spring-remoting-rmi.jsp Concept Overview Spring pr ...

  4. Spring MVC 基于Method的映射规则(注解版)

    在Restful风格的web开发中,根据不同的请求方法使用相应的控制器处理逻辑成为核心需求,下面就看看如何在Spring MVC中识别不同的请求方法. 请求方法 在Http中,请求的方法有很多种,最常 ...

  5. java spring 登录验证_浅析Spring Security登录验证流程源码

    一.登录认证基于过滤器链 Spring Security的登录验证流程核心就是过滤器链.当一个请求到达时按照过滤器链的顺序依次进行处理,通过所有过滤器链的验证,就可以访问API接口了. SpringS ...

  6. Spring查找方法注入(Lookup method injection)的底层实现原理

    2019独角兽企业重金招聘Python工程师标准>>> 美女邀我去歌舞厅娱乐,我拒绝了,我觉得跟技术宅男们分享技术更为重要. Spring方法注入的概念:一个由容器管理的single ...

  7. Spring AOP原理浅析及入门实例

    上篇问题及Spring AOP实现原理浅析 上篇说了一个AOP编程问题,那是一个错误的AOP案例.它的错误在A类中,再次粘贴A类代码: @Componentpublic class AImpl imp ...

  8. java http请求原理_浅谈Spring Cloud zuul http请求转发原理

    spring cloud 网关,依赖于netflix 下的zuul 组件 zuul 的流程是,自定义 了ZuulServletFilter和zuulServlet两种方式,让开发者可以去实现,并调用 ...

  9. 【Spring Boot】关于上传文件例子的剖析

    目录 Spring Boot 上传文件 功能实现 增加ControllerFileUploadController 增加ServiceStorageService 增加一个Thymeleaf页面 修改 ...

  10. 如何利用自定义注解放行 Spring Security 项目的接口

    在实际项目中使用到了springsecurity作为安全框架,我们会遇到需要放行一些接口,使其能匿名访问的业务需求.但是每当需要当需要放行时,都需要在security的配置类中进行修改,感觉非常的不优 ...

最新文章

  1. 蓝底换白底边缘不干净_雨刮器刮不干净别急着换,老司机教你一招,让雨刮器恢复如新!...
  2. centos安装后两个启动项、_centos8的启动项配置
  3. 一加会搭载鸿蒙,华为P50用液态镜头,小米11于29日发布,一加9一季度发布
  4. python 数字证书模拟登录_用于生成WebService使用的数字证书及签署证书.python脚本...
  5. 使用SoapHeader对WebService进行身份验证
  6. Vue学习(常用实例、脚手架搭建)-学习笔记
  7. 方维O2O系统 后台业务员功能开发
  8. Android:文件读写.
  9. Bex5开发技巧之如何在列表中显示主键字段
  10. 【OpenCV学习笔记】【函数学习】八(序列数据结构)
  11. Qcom WAPI方案
  12. java saas 开源框架_(转载)适合SaaS的几种架构比较
  13. 刷机-新版PSP2000的自制系统3.60M33刷到3.71M33的刷机教程
  14. html简单登录页面代码
  15. 加密系列 | SHA加密和解密算法详解代码示例
  16. 利用MATLAB绘制阶梯图(stairs函数)并获取所绘制的阶梯图的横纵坐标值
  17. 大学生网页制作之美食篇html+css静态网页设计
  18. Proxmox(PVE) Web 控制面板添加登录二步验证(TFA)
  19. 红日安全attck靶场7 内网靶场 WP
  20. platform驱动模型使用总结

热门文章

  1. 15. Django基础:cookies和sesseion
  2. ElemengUI:轮播图组件高度设置为全屏
  3. Node.js:使用blueimp-md5进行MD5加密
  4. Javascript特效:tab标签
  5. Visual Studio Code(VS code)简单使用入门以及常用快捷键
  6. cmake_安装导入静态/动态库的三种方式(find_package INSTALL 使用绝对路径)
  7. 这些“大学”,将被除名!
  8. C++中vector的用法
  9. 关于联想安装linux系统后无法扫描出wifi网络问题解决方案
  10. shell 判断目录还是文件