WhaleFilter简介

Jul 10, 2017 10:38:44 AM

作者:zozoh

WhaleFilter是什么?

简单来说,它是一个专门做脏活的Filter. 例如改变req的method,设置编码等.

WhaleFilter实现的是javax.servlet.Filter, 是用到web.xml里面的哦

完成WhaleFilter的初衷:

  • 如何确保req的表单参数的编码一定对, 例如ShiroFilter就有可能对req动手脚
  • 如何优雅地支持http method的隐式声明
  • 如何解决自定义日志库的加载问题
  • 如何统一 普通表单/文件上传/传json 的适配,如何把这3种形式统一起来的问题

基本用法

将其放入web.xml中,确保在所有其他Filter之前,包括NutFilter.

  1. <filter>
  2. <filter-class>org.nutz.mvc.WhaleFilter</filter-class>
  3. <filter-name>whale</filter-name>
  4. <init-param>
  5. <param-name>config</param-name>
  6. <param-value>
  7. enc.input=utf-8
  8. enc.output=utf-8
  9. </param-value>
  10. </init-param>
  11. </filter>
  12. <filter-mapping>
  13. <filter-name>whale</filter-name>
  14. <url-pattern>/*</url-pattern>
  15. </filter-mapping>

WhaleFilter通过初始化参数config, Properties文件格式(键值对)的方式进行配置

如果不声明config,那WhaleFilter不抛错也不干任何事,安安静静的

编码过滤

没错,跟Spring的编码过滤器一样,只是我们把它作为WhaleFilter的其中一个配置项了.

enc.input代表req的编码, enc.output代码resp的编码

  1. enc.input=utf-8
  2. enc.output=utf-8

http方法隐式声明

什么是http方法隐式声明? 例如 有一个form表单,需要映射到标注@DELETE的入口方法,那么, 有几个选项:

  • 通过ajax, 设置method
  • 需要声明一个隐藏参数_method=delete,让WhaleFilter为你改变req的method
    例如这样的表单
  1. <form action="/admin/topic/23?_method=delete" method="post">
  2. ...
  3. </form>

对应这样的入口方法

  1. @Ok(">>:/admin/topic")
  2. @DELETE
  3. @At("/topic/?")
  4. public void topicDelete(int id) {
  5. dao.delete(Topic.class, id);
  6. }

那WhaleFilter需要什么参数

  1. http.hidden_method_param=_method

顺带说一下, 还有一种方式, "X-HTTP-Method-Override", 可通过下面的配置开启.

  1. http.method_override=true

本页面的文字允许在知识共享 署名-相同方式共享 3.0协议GNU自由文档许可证下修改和再使用。

原文: http://nutzam.com/core/mvc/whale_filter.html