责任链模式是一种行为设计模式, 允许你将请求沿着处理者链进行发送。 收到请求后, 处理链上的每个处理者均可对请求进行处理(修改request,response,return), 或将其传递给链上的下个处理者。
servlet模块即是使用了责任链模式来对请求进行过滤。
我们模仿servlet的过滤链处理来举例说明:
第一步
首先定义过滤器处理接口:Filter
1 | public interface Filter { |
其中FilterChain是过滤链接口,过滤链组合所有的过滤器并进行顺序过滤处理
1 | public interface FilterChain { |
其中Request接口代表要处理的请求:
1 | public interface Request { |
其中Response接口代表要回复的响应:
1 | public interface Response { |
然后定义一个FilterConfig接口,FilterConfig和Filter是1对1的关系,用于对Filter参数进行封装
1 | /** |
最后定义一个Servlet接口,用于过滤处理完成之后的业务处理
1 | /** |
第二步
我们实现两个具体Filter:EnCodingFilter用于对请求编码进行验证,ContentTypeFilter用于对请求内容类型进行验证:
EnCodingFilter:
1 | public class EnCodingFilter implements Filter { |
ContentTypeFilter:
1 | public class ContentTypeFilter implements Filter { |
第三步
实现一个具体的FilterConfig,一个具体的Filter对应一个FilterConfig
1 | /** |
第四步
实现一个FilterChain,保存所有配置的Filter,并进行过滤链的调用处理:
1 | /** |
第五步
实现一个具体的业务Servlet:AppServlet
1 | public class AppServlet implements Servlet { |
第六步
提供一个工具类来组装FilterChain
1 | /** |
第七步
实现一个具体的请求类AppRequest和响应类AppResponse:
1 | public class AppRequest implements Request { |
1 | public class AppResponse implements Response { |
整个责任链模式实现完成,最后来使用下
1 | public class ChainUsage { |
提供和过滤器配置的参数一样,则过滤器处理成功,交给业务处理,输出如下:
1 | encode: utf-8 OK! |
修改request.setParameter ( “encode”, “utf-16” );测试,编码过滤器处理不通过直接返回,输出如下:
1 | ENCODING FILTER CHECKING FAIL |
修改request.setParameter ( “content-type”, “multipart/form-data” );测试,内容类型过滤器处理不通过直接返回,输出如下:
1 | encode: utf-8 OK! |