Liferay中过滤器的url mapping研究,顺带对java Web规范提点意见-阿里云开发者社区

开发者社区> 余二五> 正文

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如下:

125540570.png


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


问题分析

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

130019935.png

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

130225606.png

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


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

130419428.png

显然,因为/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()方法中:

130705443.png

它会在第204行

调用HttpServletRequestgetRequestURI() 方法获取uri。

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

130836464.png

所以当我们请求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

131006972.png


然后,

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

131058658.png


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

131231225.png


总结:

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

(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,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Web APi之过滤器创建过程原理解析【一】(十)
前言 Web API的简单流程就是从请求到执行到Action并最终作出响应,但是在这个过程有一把【筛子】,那就是过滤器Filter,在从请求到Action这整个流程中使用Filter来进行相应的处理从而作出响应,这对于认证以及授权等是及其重要的,所以说过滤器应用是Web API框架中非常重要的一种实现方式,我们有必要去探讨其原理。
758 0
Java EE 之 过滤器入门学习与总结(2)
今天就对使用Filter技术能做什么来个小小的归纳。也为了方便今后的复习。 控制浏览器不进行对jsp页面的缓存 //在doFilter方法中添加这样的代码 HttpServletRequest request = (HttpServletRequest )req; Ht...
806 0
在.Net MVC结构API接口中判断http头信息实现公共的权限验证过滤器示例
//control   action  public class TestController : ApiController { [MyAuthFilter] public string test(string str) { return str.
794 0
【Filter 页面重定向循环】写一个过滤器造成的页面重定向循环的问题
今天做一个过滤器,碰上页面重定向循环的情况: 浏览器的访问路径是:http://192.168.16.104:8080/biologyInfo/login/login/login/login/login/login/login/login/login/login/login/login/login...
925 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
3965 0
javaWeb初识 ServletContext全局对象,过滤器,监听器
ServletContext全局对象: import javax.servlet.ServletConfig; import javax.servlet.ServletContext; import javax.
679 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
5715 0
JavaWeb项目的中文乱码的原因以及Servlet中处理GET请求和POST请求编码过滤器
一、乱码原因 ①传输方和接收方采用的编码不一致。传输方对参数采用的是UTF-8编码而接收方却用GBK进行解析,当然是乱码。 ②Tomcat服务器默认采用的ISO8859-1编码得到参数值。虽然①中采用了同样的编码方式,但经过tomcat一处理,也会出现乱码(GET方式)   二、解决办法 方法一 每次传输都手动设置编码(GET方式传输数据) 传输方 String name =
1259 0
云计算设计模式(十五)——管道和过滤器模式
云计算设计模式(十五)——管道和过滤器模式 分解,执行复杂处理成一系列可重复使用分立元件的一个任务。这种模式可以允许执行的处理进行部署和独立缩放任务元素提高性能,可扩展性和可重用性。
759 0
+关注
12613
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载