Java Servlet的Filter 技术

        Filter 技术是 servlet2.3 新增加的功能。 servlet2.3 sun 公司与 2000 10 月发布的,它的开发者包括许多个人和公司团体,充分体现了 sun 公司所倡导的代码开放性原则。由于众多的参与者的共同努力, servlet2.3 比以往功能都强大了许多,而且性能也有了大幅提高。它新增加的功能包括:  
1 .应用程序生命周期事件控制;  
2 .新的国际化;  
3 .澄清了类的装载规则;  
4 .新的错误及安全属性;  
5 .不赞成使用 HttpUtils  类;  
6 .各种有用的方法;  
7 .阐明并扩展了几个 servlet DTD  
8 filter 功能。  
其中最重要的就是 filter 功能。它使用户可以改变一个 request 和修改一个 response  Filter  不是一个 servlet ,它不能产生一个 response ,它能够在一个 request 到达 servlet 之前预处理 request ,也可以在离开 servlet 时处理 response 。换种说法, filter 其实是一个” servlet chaining (servlet ) 。一个 filter 包括:  
1 .在 servlet 被调用之前截获;  
2 .在 servlet 被调用之前检查 servlet request  
3 .根据需要修改 request 头和 request 数据;  
4 .根据需要修改 response 头和 response 数据;  
5 .在 servlet 被调用之后截获。  
你能够配置一个 filter  到一个或多个 servlet ;单个 servlet servlet 组能够被多个 filter  使用。几个实用的 filter 包括:用户辨认 filter ,日志 filter ,审核 filter ,加密 filter ,符号 filter ,能改变 xml 内容的 XSLT filter 等。  
一个 filter 必须实现 javax servlet Filter 接口并定义三个方法:  
1 void setFilterConfig(FilterConfig config) // 设置 filter  的配置对象;  
2 FilterConfig getFilterConfig() // 返回 filter 的配置对象;  
3 void doFilter(ServletRequest req ServletResponse res FilterChain chain) // 执行 filter  的工作。  
服务器每次只调用 setFilterConfig 方法一次准备 filter 的处理;调用 doFilter 方法多次以处理不同的请求。 FilterConfig 接口有方法可以找到 filter 名字及初始化参数信息。服务器可以设置 FilterConfig 为空来指明 filter 已经终结。  
每一个 filter doFilter() 方法中得到当前的 request response 。在这个方法里,可以进行任何的针对 request response 的操作。 ( 包括收集数据,包装数据等 ) filter 调用 chain doFilter() 方法把控制权交给下一个 filter 。一个 filter doFilter() 方法中结束。如果一个 filter 想停止 request 处理而获得对 response 的完全的控制,那它可以不调用下一个 filter  
一个 filter 可以包装 request  response 以改变几个方法和提供用户定制的属性。 Api2.3 提供了 HttpServletRequestWrapper HttpServletResponseWrapper 来实现。它们能分派最初的 request response 。如果要改变一个方法的特性,必须继承 wapper 和重写方法。下面是一段简单的日志 filter 用来记录所有 request 的持续时间。  
程序代码:
< filter >  
< filter-name >  
log //filter 名字 
</ filter-name >  
< filter-class >  
LogFilter //filter class(上例的servlet) 
</ filter-class >  
</ filter >  
< filter-mapping >  
< filter-name > log </ filter-name >  
< servletname > servletname </ servlet-name >  
</ filter-mapping >  
< servlet >  
< servlet-name > servletname </ servletname >  
< servletclass > servletclass </ servlet-class >  
</ servlet >  
< servlet-mapping >  
< servlet-name > servletname </ servlet-name >  
< url-pattern > * </ url-pattern >  
</ servlet-mapping >   
        把这个web。xml放到web-inf中(详请参考tomcat帮助文档)。当每次请求一个request时(如index.jsp),先到LogFilter中去并调用doFilter()方法,然后才到各自的servlet中去。如果是一个简单的servlet(只是一个页面,无任何输出语句),那么可能的输出是: Request to /index.jsp : 10
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值