Grails中的UrlMappings与Filters
Grails的UrlMappings与Filters,看起来很简单,实际上,有多少人真正知道里面的内幕?
1.首先,看一下grails的整个filters链
[
1.ApplicationFilterConfig[
name=roleFilter,
filterClass=filter.RoleFilter
],
2.ApplicationFilterConfig[
name=charEncodingFilter,
filterClass=org.springframework.web.filter.DelegatingFilterProxy
],
3.ApplicationFilterConfig[
name=hiddenHttpMethod,
filterClass=org.codehaus.groovy.grails.web.filters.HiddenHttpMethodFilter
],
4.ApplicationFilterConfig[
name=grailsWebRequest,
filterClass=org.codehaus.groovy.grails.web.servlet.mvc.GrailsWebRequestFilter
],
5.ApplicationFilterConfig[
name=reloadFilter,
filterClass=org.codehaus.groovy.grails.web.servlet.filter.GrailsReloadServletFilter
],
6.ApplicationFilterConfig[
name=sitemesh,
filterClass=org.codehaus.groovy.grails.web.sitemesh.GrailsPageFilter
],
7.ApplicationFilterConfig[
name=urlMapping,
filterClass=org.codehaus.groovy.grails.web.mapping.filter.UrlMappingsFilter
],
8.ApplicationFilterConfig[
name=myGrailsFilter,
filterClass=filter.MyGrailsFilter
]
]
可以看到我们的urlMapping其实也是一个filter,而且位于filter链的末端。
1.filter.RoleFilter
这是我自己定义的权限处理类,写在web.xml中,与grails体系没有直接关系。
2.charEncodingFilter
grails中的编码转换,不多说
3.hiddenHttpMethod
大部分浏览器只支持GET/POST方法,这使得我们无法完美的实现REST。对于这样的情况,大致有几种解决方法,一种是在表单里加入一个_method之类名字的隐藏字段,用于表示真正的方法,另一种是使用X-HTTP-METHOD-OVERRIDE头信息来重载POST。这个filter处理的就是HTTP-METHOD-OVERRIDE头,比如X-HTTP-Method-Override=DELETE,那我们的request就会变成DELETE方式。通常我们不用理会这个filter
4.GrailsWebRequestFilter
绑定GrailsWebRequest到当前线程。并且实现了grails中的flash功能
5.GrailsReloadServletFilter
重新加载资源。
6.GrailsPageFilter
基本上就是干sitemesh的活。
7.UrlMappingsFilter
终于到它了。粗略地讲,可以说这是我们进入grails应用的第一道大门。因为它负责把所有请求进行分发,包括controller的请求,js及css请求等。
8.myGrailsFilter
我自已定义的grails级别的filter,也就是这个
2.进入正题
假设我这么写
那么,如何解释这个怪问题呢?
先来看UrlMappingsFilter源码
其中的WebUtils.areFileExtensionsEnabled()方法 ,判断的是我们grails项目中的configr.groovy类,
上面打框的地方默认是选中的。所以在grails中,如果你访问http://localhost/abc.css,其实会被转化成访问
http://localhost/abc,同时在request中设置一个属性CONTENT_FORMAT为css。
然后在GrailsViewResolver中,根据以下代码
上述代码比较好读了。从request中取CONTENT_FORMAT,如果有,则直接根据loader从本地文件读取,然后filter就返回了,没有向下走,当然也不会经过myGrailsFilter,更不会经过controller了。
转载于:https://my.oschina.net/showapi/blog/122816