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,是一个将软件编译.测试.部署等步骤联系在一起加以自动 ...
随机推荐
- Spark的mlib中的稠密向量和稀疏向量
spark mlib中2种局部向量:denseVector(稠密向量)和sparseVector(稀疏向量) denseVector向量的生成方法:Vector.dense() sparseVecto ...
- 初学mysql 那些记不住的命令
修改密码: https://dev.mysql.com/doc/refman/5.7/en/resetting-permissions.html MySQL 5.7.6 之后: ALTER USER ...
- nexus 随笔
离线更新中央仓库索引的方式,速度快并且可靠. 访问http://repo.maven.apache.org/maven2/.index/下载中心仓库最新版本的索引文件,我们需要下载如下两个文件nexu ...
- 软件开发者路线图梗概&书摘chapter7
软件工程是一门技艺 原因:理解不足以系统化 技能:为交付可以工作的软件 重要的原因:了解不足以将它写成可供别人直接运用并得到相同成果的格式 大多数程序员低于平均水平 工艺:一套高度重视技能的训练和传统 ...
- 试写foxit reader的ConvertToPDF功能的wrapper
相比于直接fuzzing大型程序本身,针对程序的某一特定功能写wrapper后再fuzzing则要高效的多.网上搜了下,仅有两篇关于foxit reader的wrapper文章,一个用python,另 ...
- 引擎设计跟踪 地形LOD的改进
虽然地形已经有LOD和形变(geomorphing, 这里简称morphing)来进行LOD的渐变,从而避免bump, 但是如果LOD级别过多,远处的高山就会严重丢失细节,比如变成尖尖的凸起,非常丑陋 ...
- day-12函数对象
函数默认值的细节 如果函数的默认参数的默认值为变量,在所属函数定义阶段一执行就被确定为当时变量存放的值,后面变化不会再变化 a = 100 def fn(num=a): a = 200 fn() 三元 ...
- Defender 防卫者
发售年份 1980 平台 街机 开发商 Williams 类型 射击 https://www.youtube.com/watch?v=gss3lxeqCok
- C# 如何保证对象线程内唯一:数据槽(CallContext)【转载】
如果说,一个对象保证全局唯一,大家肯定会想到一个经典的设计模式:单例模式,如果要使用的对象必须是线程内唯一的呢? 数据槽:CallContext,ok看下msdn对callcontent的解释. Ca ...
- Kettle 部署
下载kettle包 访问https://community.hitachivantara.com/docs/DOC-1009855下载kettle包 选择想要的版本 下载zip包 解压kettle包 ...