使用“过滤器”的优点
想象已经开发好应用程序的主要商业功能了, 但现在有几个需求出现:
(1) 针对所有的Servlet, 产品经理想了解从请求到响应之间的时间差.
(2) 针对某些特定的页面, 客户希望只有特定几个用户才可以浏览.
(3) 基于安全方面的考量, 用户输入的特定字符必须过滤并替换为无害的字符.
(4) 请求与响应的编码从Big5改用UTF-8
以第一个需求而言, 也许你的直觉就是, 打开每个Servlet, 在doXXX()开头与结尾取得系统时间, 计算时间差, 但如果页面有上百个或上千个, 怎么完成这些需求? 如果产品经理在你完成需求后, 又要求拿掉计算时间差的功能, 你怎么办?
收到这些需求的你, 在急忙打开相关源代码文档进行修改之前, 请先分析一下这些需求:
(1) 运行Servlet的service()方法”前”, 记录起始时间, service()方法运行”后”, 记录终止时间并计算时间查.
(2) 运行Servlet的service()方法”前”, 验证是否为允许的用户.
(3) 运行Servlet的service()方法”前”, 对请求参数进行字符过滤并替换.
(4) 运行Servlet的service()方法”前”, 对请求与响应对象设置字符编码.
经过以上分析, 可以发现这些需求, 可以在真正运行Servlet的service()方法”前”与Servlet的service()方法运行”后”中间进行实现.
性能评测, 用户验证, 字符替换, 编码设置等需求, 基本上与应用程序的业务需求没有直接关系, 只是应用程序额外的服务元件之一. 只是段时间需要它而已, 不应该为了一时的需要而修改代码强加入原有业务流程中.
因此, 如性能评测, 用户验证, 字符替换, 编码设置等需求, 应该设计为独立的元件, 随时可以加入应用程序中, 也随时可以移除, 或随时可以修改设置而不用修改原有的程序. 这类元件就像是个过滤器, 安插在Servlet与浏览器之间, 可以过滤请求与响应而作进一步的处理.
以上内容摘自:
《Servlet & JSP教学手册(第二版)》--林信良 著
Jan 6th, 2016