一 代碼結構: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 { }