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

引入:

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

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

dfbb292f5961b9ecf7eff829817b63a3.png

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

问题分析:

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

7a3dd6bf994a673ac2164cefc611927c.png

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

b3e3218f0a140ca0bdd5f297aefcbd83.png

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

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

3093222ae4fb51413a6a183c5c48dd0b.png

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

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

208023f67cb63a216955700c514d65ce.png

它会在第204行

调用HttpServletRequest的getRequestURI() 方法获取uri。

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

feab5f881b015896fdc083e744520e3d.png

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

1069bdeb56e5ae0048f562006ad3fa8c.png

然后,

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

70cbb7ef4627fdeff64f1541667595b6.png

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

67bd3f46e22dd1148d472ef2ea8150fc.png

总结:

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值