Filter简易实现.
一 代码结构:

二 代码
Test.java:
package com.demo.test; import com.demo.filter.ApplicationFilterChain;
import com.demo.impl.WebSiteFilter;
import com.demo.impl.LanguageFilter;
import com.demo.impl.LoginFilter;
import com.demo.model.Request;
import com.demo.model.Response; public class Test {
{
req = new Request();
res = new Response();
chain = new ApplicationFilterChain();
}
Request req;
Response res;
ApplicationFilterChain chain; public static void main(String[] args) {
System.out.println("starting filter...");
// new Test().testEmpty(); // new Test().testNormal1();// new Test().testNormal2();
new Test().testNormal3();
System.out.println("...end.");
System.exit(0);
} public void testEmpty() {
chain.doFilter(req, res);
} public void testNormal1() {
chain.addFilter(new WebSiteFilter());
chain.doFilter(req, res);
} public void testNormal2() {
chain.addFilter(new WebSiteFilter());
chain.addFilter(new LanguageFilter());
chain.doFilter(req, res);
} public void testNormal3() {
chain.addFilter(new WebSiteFilter());
chain.addFilter(new LanguageFilter());
chain.addFilter(new LoginFilter());
chain.doFilter(req, res);
} }
运行结果:
starting filter...
do filter website, send Redirect or Dispatch if not in Zh-CN
do filter Language, send Redirect or Dispatch if not in Chinese Language.
do filter Login, dispatch to Home Page if not authorized.
after filter doing something...
...end.
接口:
package com.demo.filter; import com.demo.model.Request;
import com.demo.model.Response; public interface Filter { void filter(Request req, Response res, FilterChain chain); }
package com.demo.filter; import com.demo.model.Request;
import com.demo.model.Response; public interface FilterChain { void doFilter(Request req, Response res); }
实现类:
package com.demo.filter; import com.demo.model.Request;
import com.demo.model.Response; public final class ApplicationFilterChain implements FilterChain { int n; int increment = 2; int position; Filter[] filters = new Filter[0]; public void addFilter(Filter filter) {
if (n == filters.length) {
Filter[] newFilters = new Filter[n + increment];
System.arraycopy(filters, 0, newFilters, 0, n);
filters = newFilters;
}
filters[n++] = filter;
} @Override
public void doFilter(Request req, Response res) {
if (position < n) {
Filter filter = filters[position++];
filter.filter(req, res, this);
return;
}
System.out.println("after filter doing something...");
} }
package com.demo.impl; import com.demo.filter.Filter;
import com.demo.filter.FilterChain;
import com.demo.model.Request;
import com.demo.model.Response; public class WebSiteFilter implements Filter { @Override
public void filter(Request req, Response res, FilterChain chain) {
System.out.println("do filter website, Send Redirect or Dispatch if not in Zh-CN. ");
boolean filterSuccess=true;
if(!filterSuccess){
// req.doDispatch();
return;
}
chain.doFilter(req, res);
} }
package com.demo.impl; import com.demo.filter.Filter;
import com.demo.filter.FilterChain;
import com.demo.model.Request;
import com.demo.model.Response; public class LanguageFilter implements Filter { @Override
public void filter(Request req, Response res, FilterChain chain) {
System.out.println("do filter Language, send Redirect or Dispatch if not in Chinese Language. ");
chain.doFilter(req, res);
} }
package com.demo.impl; import com.demo.filter.Filter;
import com.demo.filter.FilterChain;
import com.demo.model.Request;
import com.demo.model.Response; public class LoginFilter implements Filter { @Override
public void filter(Request req, Response res, FilterChain chain) {
System.out.println("do filter Login, dispatch to Home Page if not authorized. ");
chain.doFilter(req, res);
} }
package com.demo.model;
public class Request {
}
package com.demo.model;
public class Response {
}
Filter简易实现.的更多相关文章
- django 操作数据库--orm(object relation mapping)---models
思想 django为使用一种新的方式,即:关系对象映射(Object Relational Mapping,简称ORM). PHP:activerecord Java:Hibernate C#:Ent ...
- .NET Core的文件系统[5]:扩展文件系统构建一个简易版“云盘”
FileProvider构建了一个抽象文件系统,作为它的两个具体实现,PhysicalFileProvider和EmbeddedFileProvider则分别为我们构建了一个物理文件系统和程序集内嵌文 ...
- 《winform窗体应用程序》----------简易记事本
首先先给大家发表几张图片,描述一下记事本程序要实现的功能以及界面设计. 以上这些就是简易记事本的的主界面设计. 下面我们来做一些简单的讲解: 1.使用MenuStrip控件来实现菜单栏的基本设计. 在 ...
- [后端人员耍前端系列]AngularJs篇:使用AngularJs打造一个简易权限系统
一.引言 上一篇博文已经向大家介绍了AngularJS核心的一些知识点,在这篇博文将介绍如何把AngularJs应用到实际项目中.本篇博文将使用AngularJS来打造一个简易的权限管理系统.下面不多 ...
- 使用 HttpClient 和 HtmlParser 实现简易爬虫
这篇文章介绍了 HtmlParser 开源包和 HttpClient 开源包的使用,在此基础上实现了一个简易的网络爬虫 (Crawler),来说明如何使用 HtmlParser 根据需要处理 Inte ...
- [转]使用 HttpClient 和 HtmlParser 实现简易爬虫
http://www.ibm.com/developerworks/cn/opensource/os-cn-crawler/ http://blog.csdn.net/dancen/article/d ...
- JSP简易留言板
写在前面 在上篇博文JSP内置对象中介绍JSP的9个内置对象的含义和常用方法,但都是比较理论的知识.今天为大家带来一个小应用,用application制作的简易留言板. 包括三个功能模块:留言提交.留 ...
- C# Socket 简易的图片传输
关于网络的数据传输我就是个小白,所以今天学习一下简易的Socket图片传输. 客户端和服务器的连接咱们上次已经学过了,咱们先从简易的文件传输入手.下面开始代码分析了. Server.cs using ...
- Ant 简易教程
转载:http://www.cnblogs.com/jingmoxukong/p/4433945.html Ant 简易教程 Apache Ant,是一个将软件编译.测试.部署等步骤联系在一起加以自动 ...
随机推荐
- Winscp无法连接linux虚拟机解决
之前需要从主机传文件到虚拟机上,安装了vmware tools,拖拽文件后发现文件总是会损坏一些,查了一下,使用Winscp就不会出现这个问题. 安装好后配置连接:(Centos7) 打开虚拟机,找到 ...
- PHP实现RabbitMQ消息队列(转)
本篇文章给大家带来的内容是关于PHP和RabbitMQ实现消息队列的完整代码,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 先安装PHP对应的RabbitMQ,这里用的是 php_a ...
- SublimeText 3200 package Control 安装
写一点自己的坑 花了2个小时时间才弄好 先上干货 https://github.com/wbond/package_control 这里直接 Clone zip 解压 后将整个文件夹改名为 " ...
- PKU《程序设计》专项课程_递归汉诺塔问题
取自coursera.org上公开课北京大学<C程序设计进阶> 递归调用注意的点 1.关注点放在求解的目标上,递推是,目标放在开头 2.找到第N次和第(N-1)次之间的关系,通项公式 3. ...
- 20175120彭宇辰 《Java程序设计》第七周学习总结
#教材内容总结 第八章 常用实用类 一.String类 String类用来处理字符序列,在java.lang包中,程序可以直接使用String类.需要注意的是Java把String类声明为final类 ...
- E - 改革春风吹满地
按顺时针或者逆时针顺序输入n个点,求输入点围城的多边形的面积.凸凹都可以计算. 模板 #include <iostream> #include <cstring> #inclu ...
- SQL Server中的连接查询(内连接、外连接、交叉连接)
在数据库查询中,经常会用到两个有关联的表进行查询,需要把两个表中的数据按照某些条件查出来,这时就可以使用连接查询 连接查询分为三种:内连接.外连接和交叉连接 1. 内连接 内连接inner join ...
- EXCEL 批量添加单元格名称
在EXCEL单元格的值填入想为其设置的名称之后,调整下述代码的begin_line,begin_column,end_line,end_column的值,执行此宏,可用于批量为单元格设置名称. (注: ...
- DNS服务器地址汇总
如果修改DNS服务器地址就可以访问google等服务,你还等什么?使用免费DNS解析服务除了去掉了运营商的各种广告,还有个最大的好处就是不会重定向或者过滤用户所访问的地址,这样就防止了很多网站被电信. ...
- CRC16 的生成及校验原理
参考:https://blog.csdn.net/niepangu/article/details/45499383 计算CRC的过程,就是用一个特殊的“除法”,来得到余数,这个余数就是CRC. 它不 ...