Filter简易实现.

一 代码结构:java

  

二 代码web

  Test.java:ide

  

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);
    }

}

运行结果:this

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.spa

 

 

 

 接口:code

  

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);

}

 

实现类:orm

  

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 {

}