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.进入正题

假设我这么写



也就是说,只要是后缀是css的,我都把它们转到auth这个controller去。但是很奇怪的是,当我访问http://localhost/abc.css时,这个请求到urlmapping后,就没有进得去myGrailsFilter,更不要谈进去auth这个controller了。

那么,如何解释这个怪问题呢?

先来看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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值