Interception Filter.
概述:一旦构建起来了一个网络应用程序,你可能需要一个前端的组件,来控制后面的流程。比如一个受保护的资源,只有通过了认证的客户才可以访问,没有通过认证的用户,就只能去浏览别的资源。或者是从IE浏览器发出的请求我们接受,然后转发到后台,其余浏览器发出的请求我们拒绝。在一个就是封装客户的请求以及封装请求结果,例如加密用户的信用卡号码等等需求。有或者我们只是限制某些ip可以访问,其余的不可以。就好比北京奥运会网络直播,就只能中国大陆用户,那些海外的华人,华侨就无法通过网络来观看现场直播的能诸多功能(本人深受其害)。
那么好,我们就用一个最简单的,谁都会的登陆用户的例子来说明,这样的一个简单的功能你一定会做,不就是一个用户登陆嘛。。多简单,对!的确是一个用户登陆,所以我们一般使用一个东西(文件,或者servlet)来判断,然后利用session.比如一个servlet - checkLogin
String username = request.getParameter(“username”);
String password = request.getParameter(“password”);
if(userName.equals(“password”))
{
HttpSession session = request.getSession(“true”);
session.setAttribute(“isLogin”, “yes”);
RequestDispatcher rd = request.getRequestDispatcher(“afterLogin.html”);
rd.forward(request,response);
…
}
没错,所有的需要安全验证的资源都会判断session,而这个session正是来源于我们的那个总授权的checkLogin. 这就是一个interception filter 的一个典型例子。所以吧你需要统一认证,判断的部分集中在一起,以后如果需要更改判断的约束条件,就只需要修改filter本身,而程序的跳转,业务逻辑完全不受影响。
以下图片说明了filter之间的认证,传递关系。
优点:由于本身就是filter, 所以可以通过filterChain来传递,利用filterManager来管理,多个不同的filter可以松耦合,因此各个部分可以被充分的利用和重用;所有的filter都在web.xml中配置,所以日后如果需要维护,更换不同的filter,只需要修改配置文件即可修改filter跟程序之间的搭配关系,不需要碰到现有的代码,非常有利于扩展。
缺点:由于过分的松耦合,每一个部分不会依赖于另外的部分,所以不同的filter之间要利用协议来传递信息共享。
举例:可以利用Wrapper来封装客户的请求还有回应信息;控制不同客户端访问不同的代码;国际化或者本地化显示资源;对于session的共享控制;页面的转发跳转,log等.
考试:记住以下的要点,有助于通过考试。
1. Centralizes Control with Loosely Coupled Handlers.
2. Improves Reusability.
3. Declarative and Flexible Configuration.
4. Information Sharing is Inefficient.
5. Reduce line of codes in application.
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/225526/viewspace-448512/ ,如需转载,请注明出处,否则将追究法律责任。