Spring StringUtils#cleanPath method 浅析
来源: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 浅析相关推荐
- spring初始化源码浅析之代码浅析
目录 1.refresh()简介 2.关键代码跟踪 2.1.obtainFreshBeanFactory()代码分析 2.2.invokeBeanFactoryPostProcessors(bean ...
- Spring Security 4 Method security using @PreAuthorize,@PostAuthorize, @Secured, EL--转
原文地址:http://websystique.com/spring-security/spring-security-4-method-security-using-preauthorize-pos ...
- Spring Remoting: Remote Method Invocation (RMI)--转
原文地址:http://www.studytrails.com/frameworks/spring/spring-remoting-rmi.jsp Concept Overview Spring pr ...
- Spring MVC 基于Method的映射规则(注解版)
在Restful风格的web开发中,根据不同的请求方法使用相应的控制器处理逻辑成为核心需求,下面就看看如何在Spring MVC中识别不同的请求方法. 请求方法 在Http中,请求的方法有很多种,最常 ...
- java spring 登录验证_浅析Spring Security登录验证流程源码
一.登录认证基于过滤器链 Spring Security的登录验证流程核心就是过滤器链.当一个请求到达时按照过滤器链的顺序依次进行处理,通过所有过滤器链的验证,就可以访问API接口了. SpringS ...
- Spring查找方法注入(Lookup method injection)的底层实现原理
2019独角兽企业重金招聘Python工程师标准>>> 美女邀我去歌舞厅娱乐,我拒绝了,我觉得跟技术宅男们分享技术更为重要. Spring方法注入的概念:一个由容器管理的single ...
- Spring AOP原理浅析及入门实例
上篇问题及Spring AOP实现原理浅析 上篇说了一个AOP编程问题,那是一个错误的AOP案例.它的错误在A类中,再次粘贴A类代码: @Componentpublic class AImpl imp ...
- java http请求原理_浅谈Spring Cloud zuul http请求转发原理
spring cloud 网关,依赖于netflix 下的zuul 组件 zuul 的流程是,自定义 了ZuulServletFilter和zuulServlet两种方式,让开发者可以去实现,并调用 ...
- 【Spring Boot】关于上传文件例子的剖析
目录 Spring Boot 上传文件 功能实现 增加ControllerFileUploadController 增加ServiceStorageService 增加一个Thymeleaf页面 修改 ...
- 如何利用自定义注解放行 Spring Security 项目的接口
在实际项目中使用到了springsecurity作为安全框架,我们会遇到需要放行一些接口,使其能匿名访问的业务需求.但是每当需要当需要放行时,都需要在security的配置类中进行修改,感觉非常的不优 ...
最新文章
- 蓝底换白底边缘不干净_雨刮器刮不干净别急着换,老司机教你一招,让雨刮器恢复如新!...
- centos安装后两个启动项、_centos8的启动项配置
- 一加会搭载鸿蒙,华为P50用液态镜头,小米11于29日发布,一加9一季度发布
- python 数字证书模拟登录_用于生成WebService使用的数字证书及签署证书.python脚本...
- 使用SoapHeader对WebService进行身份验证
- Vue学习(常用实例、脚手架搭建)-学习笔记
- 方维O2O系统 后台业务员功能开发
- Android:文件读写.
- Bex5开发技巧之如何在列表中显示主键字段
- 【OpenCV学习笔记】【函数学习】八(序列数据结构)
- Qcom WAPI方案
- java saas 开源框架_(转载)适合SaaS的几种架构比较
- 刷机-新版PSP2000的自制系统3.60M33刷到3.71M33的刷机教程
- html简单登录页面代码
- 加密系列 | SHA加密和解密算法详解代码示例
- 利用MATLAB绘制阶梯图(stairs函数)并获取所绘制的阶梯图的横纵坐标值
- 大学生网页制作之美食篇html+css静态网页设计
- Proxmox(PVE) Web 控制面板添加登录二步验证(TFA)
- 红日安全attck靶场7 内网靶场 WP
- platform驱动模型使用总结
热门文章
- 15. Django基础:cookies和sesseion
- ElemengUI:轮播图组件高度设置为全屏
- Node.js:使用blueimp-md5进行MD5加密
- Javascript特效:tab标签
- Visual Studio Code(VS code)简单使用入门以及常用快捷键
- cmake_安装导入静态/动态库的三种方式(find_package INSTALL 使用绝对路径)
- 这些“大学”,将被除名!
- C++中vector的用法
- 关于联想安装linux系统后无法扫描出wifi网络问题解决方案
- shell 判断目录还是文件