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,是一个将软件编译.测试.部署等步骤联系在一起加以自动 ...
随机推荐
- rsa公钥和私钥的生成
在liunx环境中 openssl 然后生成私钥: genrsa -out app_private_key.pem 2048 # 私钥的生成 在利用私钥生成公钥: rsa -in app_privat ...
- python request 和requests 的区别
说明: 这里主要记录一下requests模块的如下几点: 1.requests模块的安装 2.requests模块发送get请求 3.requests模块发送post请求 4.requests模块上传 ...
- python矩阵的切片(或截取)
矩阵一般有行也有列,所以矩阵的截取也需要包含行和列两个参数. 假设a是一个矩阵,a的截取就可写成:a[起始行:终止行,起始列:终止列],中括号中有一个逗号,逗号前的是为了分割行的,逗号后的是为了分割列 ...
- Redis的使用原理
原理介绍 (1)什么是redis? Redis 是一个基于内存的高性能key-value数据库. (有空再补充,有理解错误或不足欢迎指正) (2)Reids的特点 Redis本质上是一个Key-Val ...
- 我的代码-random forest
# coding: utf-8 # In[1]: import pandas as pdimport numpy as npfrom sklearn import treefrom sklearn.s ...
- 第四次Scrum冲刺----Life in CCSU
一.第四次Scrum任务 小组GitHub地址链接 个人GitHub地址链接:https://github.com/2505486985/FirstScrum 继续上次完成的任务,这次完成校园服务中的 ...
- 关于jstl中碰到的Property 'username' not found on type java.lang.String异常
在jstl的forEach循环的时候总是有异常,刚开始以为是把类的属性名打错了,因为显示的是Property not found,但就算从类文件里面复制属性名过来依然显示的是Property not ...
- 搭建开发环境2)Debian8 安装jdk 1.8
1.由于Debian自带了openjava运行时需要先卸载掉 java -version //查看当前java版本 apt-get remove openjdk* //卸载当前的openjdk 2.下 ...
- Django(其二)
session def session_login(request): if request.method=='POST': username = request.POST.get('user') p ...
- 2.GUI控件的使用 --《UNITY 3D 游戏开发》笔记
1.Label 控件 编写脚本文件,直接绑定在main camera上 public class labelScript : MonoBehaviour { //设定一个值来接收外部赋值的字符串 pu ...