一 代码结构:

  

二 代码

  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简易实现.的更多相关文章

  1. django 操作数据库--orm(object relation mapping)---models

    思想 django为使用一种新的方式,即:关系对象映射(Object Relational Mapping,简称ORM). PHP:activerecord Java:Hibernate C#:Ent ...

  2. .NET Core的文件系统[5]:扩展文件系统构建一个简易版“云盘”

    FileProvider构建了一个抽象文件系统,作为它的两个具体实现,PhysicalFileProvider和EmbeddedFileProvider则分别为我们构建了一个物理文件系统和程序集内嵌文 ...

  3. 《winform窗体应用程序》----------简易记事本

    首先先给大家发表几张图片,描述一下记事本程序要实现的功能以及界面设计. 以上这些就是简易记事本的的主界面设计. 下面我们来做一些简单的讲解: 1.使用MenuStrip控件来实现菜单栏的基本设计. 在 ...

  4. [后端人员耍前端系列]AngularJs篇:使用AngularJs打造一个简易权限系统

    一.引言 上一篇博文已经向大家介绍了AngularJS核心的一些知识点,在这篇博文将介绍如何把AngularJs应用到实际项目中.本篇博文将使用AngularJS来打造一个简易的权限管理系统.下面不多 ...

  5. 使用 HttpClient 和 HtmlParser 实现简易爬虫

    这篇文章介绍了 HtmlParser 开源包和 HttpClient 开源包的使用,在此基础上实现了一个简易的网络爬虫 (Crawler),来说明如何使用 HtmlParser 根据需要处理 Inte ...

  6. [转]使用 HttpClient 和 HtmlParser 实现简易爬虫

    http://www.ibm.com/developerworks/cn/opensource/os-cn-crawler/ http://blog.csdn.net/dancen/article/d ...

  7. JSP简易留言板

    写在前面 在上篇博文JSP内置对象中介绍JSP的9个内置对象的含义和常用方法,但都是比较理论的知识.今天为大家带来一个小应用,用application制作的简易留言板. 包括三个功能模块:留言提交.留 ...

  8. C# Socket 简易的图片传输

    关于网络的数据传输我就是个小白,所以今天学习一下简易的Socket图片传输. 客户端和服务器的连接咱们上次已经学过了,咱们先从简易的文件传输入手.下面开始代码分析了. Server.cs using ...

  9. Ant 简易教程

    转载:http://www.cnblogs.com/jingmoxukong/p/4433945.html Ant 简易教程 Apache Ant,是一个将软件编译.测试.部署等步骤联系在一起加以自动 ...

随机推荐

  1. ubuntu编译安装opencv

    简易安装opencv2: conda install --channel https://conda.anaconda.org/menpo opencv 或: sudo apt-get install ...

  2. Hive的初识

    Hive是构建于Hadoop上的数据仓库基础框架,它提供了以下功能: 可通过SQL轻松的访问数据,从而实现数据仓库的任务.如提取/转换/加载,报告和数据分析. 对各种数据格式施加结构. 访问存储在HD ...

  3. alsa音频播放过程中的基本概念

    以下为 ALSA-Project/FramesPeriods[1] 学习笔记 1, sample_rate: 即每秒进行多少次采样,常见的比如 8000.16000.44100和48000等 2, s ...

  4. ImageUtil

    package com.rscode.credits.util; import java.io.File; import java.io.IOException; import java.util.A ...

  5. appium---android元素定位

    原文链接:https://www.cnblogs.com/meitian/p/6103391.html 一.常用识别元素的工具 uiautomator:Android SDK自带的一个工具,在tool ...

  6. PyCharm提交代码到git

  7. Web应用程序的安全问题

    常规的安全问题主要分为以下几大类 一,跨站脚本攻击(XSS) 指的是攻击者向web页面注入恶意的Javascript代码,然后提交给服务器,但是服务器并没有做校验和转义等处理,随即服务器的响应页就被植 ...

  8. mac 常用技巧

    1.xcode-select --install 2.iterm2 https://www.cnblogs.com/xishuai/p/mac-iterm2.html 3.SUDO 免密码 visud ...

  9. Mybatis---架构图

  10. 古墓丽影:崛起 PC版今日发售

    之前xbox one的独占游戏 古墓丽影: 崛起(Rise of the Tomb Raider™), 今天正式在steam发售了, 之前就可以预购.简单看了一下, 画风跟前代类似, 但是画面更好, ...