Liferay中过滤器的url mapping研究,顺带对java Web规范提点意见

简介:

引入:

在昨天和同事讲解Minifier Filter时候被问住了,因为我们的访问 url是

http://172.29.175.236:8080/platform-In-theme/css/main.css?browserId=firefox&themeId=platformIn_WAR_platformIntheme&minifierType=css&languageId=en_US&b=6100&t=1377246011000


而Minifier Filter定义的url-mapping如下:


这个url带了这么多连七八糟的参数,分明不匹配这个url-pattern嘛(其实更像是*.css*),那么为什么会进入到这个MinifierFilter过滤器呢?我当时被问住了。


问题分析

为了解决这个问题,我今天花了点时间进行了分析,首先肯定,为了判断一个请求是否要经过某个过滤器,肯定有个返回boolean的方法,我们找到了,这个方法是FilterMapping的isMatch()方法:

从调试信息看,当传递到isMatch()方法的时候,这个uri就已经是/css/main.css了,而我们从<filter-mapping>中的<url-pattern>读取url-pattern是*.css时候,

它会去比较uri和url-pattern,这个比较是通过方法:isMatchURLPattern(uri,urlPattern)


因为我们是*.css,所以它匹配urlPattern.startsWith(_STAR_PERIOD)这个分支:

显然,因为/css/main.css满足*.css,所以它必定返回true.



所以,我们问题的焦点是:当我们请求url是http://172.29.175.236:8080/platform-In-theme/css/main.css?browserId=firefox&themeId=platformIn_WAR_platformIntheme&minifierType=css&languageId=en_US&b=6100&t=1377246011000 时候,为什么对应的uri是/css/main.css 呢?


显然,我们很快的找到了从HttpServletRequest到uri的过程封装在InvokerFilter的getURI()方法中:

它会在第204行

调用HttpServletRequestgetRequestURI() 方法获取uri。

查阅官方文档可以看到HttpServletRequestgetRequestURI()方法只获取请求url中从协议名字到查询字符串的部分,所以它会去掉sheme,host,port和后面的查询字符串。

所以当我们请求http://172.29.175.236:8080/platform-In-theme/css/main.css?browserId=firefox&themeId=platformIn_WAR_platformIntheme&minifierType=css&languageId=en_US&b=6100&t=1377246011000时候,

执行完第204行:uri=request.getRequestURI后,返回的uri/platform-In-theme/css/main.css



然后,

再从207行到210行去掉contextPath部分:


所以,在执行第211行子字符串截取之后,就把“/platform-In-theme"这个contextPath从刚才的uri (/platform-In-theme/css/main.css)中去除了,最终的uri 就是我们期望的uri:


总结:

从这里我们可以有以下结论:

(1)在Liferay的过滤器通过url-mapping匹配url时候,它其实比对的不是请求url(包含scheme,host,port,contextpath, uri,queryString),而是请求uri. 这里也顺便吐槽下java web规范,我觉得对于<filter-pattern>的<url-pattern>命名很不合理,应该叫<uri-pattern>,因为如果叫<url-pattern>的话,应该表明配置url的模式,但是实际比较的确是uri,所以会让人误解,这也是昨天我被问住的原因。如果叫<uri-pattern>的话,那么大家一定会吧uri和这个模式匹配,这样结果就对了。

(2)Liferay中的uri和java web规范中的uri还不完全一样。在java web协议中,uri只是吧scheme,host,port和queryString去掉,所以说,java web协议中的uri=contextPath+后面的path,而在Liferay中的uri,还必须把contextPath部分去掉。





本文转自 charles_wang888 51CTO博客,原文链接:http://blog.51cto.com/supercharles888/1285073,如需转载请自行联系原作者
目录
相关文章
|
11月前
|
安全 Java API
Java Web 在线商城项目最新技术实操指南帮助开发者高效完成商城项目开发
本项目基于Spring Boot 3.2与Vue 3构建现代化在线商城,涵盖技术选型、核心功能实现、安全控制与容器化部署,助开发者掌握最新Java Web全栈开发实践。
841 1
|
11月前
|
存储 前端开发 Java
【JAVA】Java 项目实战之 Java Web 在线商城项目开发实战指南
本文介绍基于Java Web的在线商城技术方案与实现,涵盖三层架构设计、MySQL数据库建模及核心功能开发。通过Spring MVC + MyBatis + Thymeleaf实现商品展示、购物车等模块,提供完整代码示例,助力掌握Java Web项目实战技能。(238字)
1258 0
|
10月前
|
缓存 安全 Java
《深入理解Spring》过滤器(Filter)——Web请求的第一道防线
Servlet过滤器是Java Web核心组件,可在请求进入容器时进行预处理与响应后处理,适用于日志、认证、安全、跨域等全局性功能,具有比Spring拦截器更早的执行时机和更广的覆盖范围。
|
12月前
|
前端开发 Java 数据库
Java 项目实战从入门到精通 :Java Web 在线商城项目开发指南
本文介绍了一个基于Java Web的在线商城项目,涵盖技术方案与应用实例。项目采用Spring、Spring MVC和MyBatis框架,结合MySQL数据库,实现商品展示、购物车、用户注册登录等核心功能。通过Spring Boot快速搭建项目结构,使用JPA进行数据持久化,并通过Thymeleaf模板展示页面。项目结构清晰,适合Java Web初学者学习与拓展。
661 1
|
存储 监控 算法
企业上网监控场景下布隆过滤器的 Java 算法构建及其性能优化研究
布隆过滤器是一种高效的数据结构,广泛应用于企业上网监控系统中,用于快速判断员工访问的网址是否为违规站点。相比传统哈希表,它具有更低的内存占用和更快的查询速度,支持实时拦截、动态更新和资源压缩,有效提升系统性能并降低成本。
611 0
|
机器学习/深度学习 存储 算法
基于 C++ 布隆过滤器算法的局域网上网行为控制:URL 访问过滤的高效实现研究
本文探讨了一种基于布隆过滤器的局域网上网行为控制方法,旨在解决传统黑白名单机制在处理海量URL数据时存储与查询效率低的问题。通过C++实现URL访问过滤功能,实验表明该方法可将内存占用降至传统方案的八分之一,查询速度提升约40%,假阳性率可控。研究为优化企业网络管理提供了新思路,并提出结合机器学习、改进哈希函数及分布式协同等未来优化方向。
383 0
|
SQL 存储 XML
常见Web漏洞分析与防范研究
在以上内容中,结合OWASP、Toptal和Brightsec等权威来源的信息,确保回答的专业性和准确性。通过图表和思维导图的方式,可以更系统地了解和记忆Web安全知识,帮助企业在实际应用中更好地防范各种安全威胁。
913 13
|
中间件 编译器 数据处理
在web开发中应用管道过滤器
【9月更文挑战第1天】本文介绍管道-过滤器架构将数据处理流程分解为一系列独立组件,通过管道连接,适用于数据流处理如图像处理、编译器设计等。通过具体实例说明了Gin如何有效支持管道-过滤器风格的设计,构建高性能Web服务。
431 10
|
安全 前端开发 Java
Web端系统开发解决跨域问题——以Java SpringBoot框架配置Cors为例
在Web安全上下文中,源(Origin)是指一个URL的协议、域名和端口号的组合。这三个部分共同定义了资源的来源,浏览器会根据这些信息来判断两个资源是否属于同一源。例如,https://www.example.com:443和http://www.example.com虽然域名相同,但由于协议和端口号不同,它们被视为不同的源。同源(Same-Origin)是指两个URL的协议、域名和端口号完全相同。只有当这些条件都满足时,浏览器才认为这两个资源来自同一源,从而允许它们之间的交互操作。
718 0
Web端系统开发解决跨域问题——以Java SpringBoot框架配置Cors为例