您的位置:首页 > 编程语言 > Java开发

Spring 4.x官方参考文档中文版——第21章 Web MVC框架(6)

2016-05-24 15:20 1106 查看
使用Placeholder(占位符)的路径模式

在@RequestMapping注解中,支持${...}占位符,这可以用来来代替本地路径、系统路径和环境变量,如果一个controller映射的路径需要在配置文件中自定义的话,这会很方便。如果需要详细了解placeholder(占位符),参考PropertyPlaceholderConfigurer类的javadocs文档。

后缀模式匹配

默认情况下,Spring MVC执行”.*”后缀模式匹配,所以,在controller中,映射”/person”路径的时候,也映射到了”/person.*”路径,当通过URL路径(例如:”/person.pdf”,”/person.xml”)请求不同的资源时,这会很方便。

后缀模式匹配能被关闭,或者为了达到(content negotiation)内容协商的目的,显式地注册一组路径,来只对注册了的路径进行后缀匹配。一般来讲,这是为了使request映射(类似”/person/{id}”这种,在id变量中的一个”.”(点)并不代表文件后缀,比如:”/person/joe@email.com”和”/person/joe@email.com.json”这种)更加清晰,最小化模糊度。此外,在一些情况下,后缀模式匹配和内容协商会被恶意利用,所以,限制它们是很有必要的。

后缀匹配模式与RFD(反射型文件下载)

2014年,RFD(反射型文件下载)攻击在paperby Trustwave被首次提出。这种攻击类似XSS(跨站脚本)攻击,它依靠在响应中被反射的输入(比如:查询参数,URI变量)。然而,RFD并不是把JavaScript输入成HTML,而是依赖浏览器,切换成一次下载,基于文件路径(如:”.bat”,”.cmd”),把响应看作一个可执行的脚本。

在Spring MVC中,@ResponseBody和ResponseEntity方法是有风险的,因为它们能把用URL路径来进行请求的客户端渲染成不同的内容类型。请注意,为了防止RFD攻击,而去关闭后缀模式匹配和不使用内容协商目的的路径扩展名,是无效的。

为了全面防范RFD攻击,在渲染response响应主体前,Spring MVC添加了”Content-Disposition:inline;filename=f.txt”header(报头)来修正成安全的下载文件名。这只在URL路径扩展名拥有一个既不在白名单里,也没有在为内容协商目的而显式注册的文件扩展中才使用。然而,当URL直接输入到浏览器中的时候,这会有潜在的副作用。

常见的路径扩展名默认是在白名单中的,此外,REST API的调用一般来讲也并不意味着直接在浏览器中使用URL,然而,使用能够为内容协商和Content-Dsiposition报头来显式注册文件扩展名的自定义HttpMessageConverter实现的应用,是不会添加这样的扩展名的。详见”内容协商”部分章节。

小提示:

这些内容,最初是作为CVE-2015-5211中的部分内容被介绍了的。以下是报告中附加的推荐内容:

Encode rather than escape JSON responses(暂译:与其逃避JSON响应,不如去编码),这同时也是OWASP XSS的推荐内容。
把后缀模式匹配关闭,或者限制只使用显式注册了的后缀。
在内容协商中的”userJaf”和“ignoreUnknownPathExtensions”属性设置为“false”,这样在URL有未知的扩展名时,能够以406响应。
在响应的报头添加”X-Content-Type-Options: nosniff”,SpringSecurity 4已经默认这么做了。;

矩阵变量

在URI规范RFC 3986中,定义了在路径片段中包含“名称-值”成对的可能性。在标准中,这样的组合没有特定术语来表示。相比一个更特别的名称:”矩阵URL“来说,被称为”URI路径参数”一般来说更容易被人们接受。这个由Tim
Berners-Lee提出的名称,也十分出名,并被高频度使用。而在SpringMVC中,把这种组合称为矩阵变量。

矩阵变量可在任何路径片段中出现,每个矩阵变量以”;”(分号)分开,例如:”/cars;color=red;year=2012”,多值以“,“分开,”color=red,green,blue” 或者变量名重复”color=red;color=green;color=blue”。

如果一个URL想要包含矩阵变量,在请求映射模式中必须用URI模板来表示,这能保证以请求提供的任何规则下的矩阵变量,无论其出现与否,请求都能够被正确匹配。

下面的例子展示了矩阵变量”q”的获取:



由于所有路径片段都可能包含了矩阵变量,在一些情况下你可能需要更加明确地指出哪一个变量是什么:



矩阵变量也可以被定义为可选的,有默认值的:



所有矩阵变量也可以包含在一个Map中:



注意,如要启用矩阵变量的使用,需要把RequestMappingHandlerMapping的removeSemicolonContent设置为false,而这个属性默认是true的。

小提示:

MVC java配置和MVC命名空间都提供了选项来启用矩阵变量的使用。

如果你正在使用Java配置,在”对MVC Java配置进行进阶自定义”一章中描述了RequestMappingHandlerMapping可以被怎样自定义。

在MVC 命名空间,<mvc:annotation-driven>元素有enable-matrix-variables属性,它默认是false,需要被设置为true。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: