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,如需转载请自行联系原作者
目录
相关文章
|
10月前
|
安全 Java API
Java Web 在线商城项目最新技术实操指南帮助开发者高效完成商城项目开发
本项目基于Spring Boot 3.2与Vue 3构建现代化在线商城,涵盖技术选型、核心功能实现、安全控制与容器化部署,助开发者掌握最新Java Web全栈开发实践。
819 1
|
10月前
|
存储 前端开发 Java
【JAVA】Java 项目实战之 Java Web 在线商城项目开发实战指南
本文介绍基于Java Web的在线商城技术方案与实现,涵盖三层架构设计、MySQL数据库建模及核心功能开发。通过Spring MVC + MyBatis + Thymeleaf实现商品展示、购物车等模块,提供完整代码示例,助力掌握Java Web项目实战技能。(238字)
1235 0
|
11月前
|
JavaScript Java 微服务
现代化 Java Web 在线商城项目技术方案与实战开发流程及核心功能实现详解
本项目基于Spring Boot 3与Vue 3构建现代化在线商城系统,采用微服务架构,整合Spring Cloud、Redis、MySQL等技术,涵盖用户认证、商品管理、购物车功能,并支持Docker容器化部署与Kubernetes编排。提供完整CI/CD流程,助力高效开发与扩展。
1130 64
|
11月前
|
前端开发 Java 数据库
Java 项目实战从入门到精通 :Java Web 在线商城项目开发指南
本文介绍了一个基于Java Web的在线商城项目,涵盖技术方案与应用实例。项目采用Spring、Spring MVC和MyBatis框架,结合MySQL数据库,实现商品展示、购物车、用户注册登录等核心功能。通过Spring Boot快速搭建项目结构,使用JPA进行数据持久化,并通过Thymeleaf模板展示页面。项目结构清晰,适合Java Web初学者学习与拓展。
635 1
|
12月前
|
缓存 NoSQL Java
Java Web 从入门到精通之苍穹外卖项目实战技巧
本项目为JavaWeb综合实战案例——苍穹外卖系统,涵盖Spring Boot 3、Spring Cloud Alibaba、Vue 3等主流技术栈,涉及用户认证、订单处理、Redis缓存、分布式事务、系统监控及Docker部署等核心功能,助你掌握企业级项目开发全流程。
1174 0
|
12月前
|
安全 JavaScript Java
java Web 项目完整案例实操指南包含从搭建到部署的详细步骤及热门长尾关键词解析的实操指南
本项目为一个完整的JavaWeb应用案例,采用Spring Boot 3、Vue 3、MySQL、Redis等最新技术栈,涵盖前后端分离架构设计、RESTful API开发、JWT安全认证、Docker容器化部署等内容,适合掌握企业级Web项目全流程开发与部署。
1030 0
|
12月前
|
存储 监控 算法
企业上网监控场景下布隆过滤器的 Java 算法构建及其性能优化研究
布隆过滤器是一种高效的数据结构,广泛应用于企业上网监控系统中,用于快速判断员工访问的网址是否为违规站点。相比传统哈希表,它具有更低的内存占用和更快的查询速度,支持实时拦截、动态更新和资源压缩,有效提升系统性能并降低成本。
570 0
|
机器学习/深度学习 存储 算法
基于 C++ 布隆过滤器算法的局域网上网行为控制:URL 访问过滤的高效实现研究
本文探讨了一种基于布隆过滤器的局域网上网行为控制方法,旨在解决传统黑白名单机制在处理海量URL数据时存储与查询效率低的问题。通过C++实现URL访问过滤功能,实验表明该方法可将内存占用降至传统方案的八分之一,查询速度提升约40%,假阳性率可控。研究为优化企业网络管理提供了新思路,并提出结合机器学习、改进哈希函数及分布式协同等未来优化方向。
356 0
|
网络协议 Java Shell
java spring 项目若依框架启动失败,启动不了服务提示端口8080占用escription: Web server failed to start. Port 8080 was already in use. Action: Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port-优雅草卓伊凡解决方案
java spring 项目若依框架启动失败,启动不了服务提示端口8080占用escription: Web server failed to start. Port 8080 was already in use. Action: Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port-优雅草卓伊凡解决方案
1146 7