前言 
本篇是学习 Shiro 中如何初始化过滤器链的
  实践 
首先,随便定义几个过滤器 
 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 public  class  AnonymousFilter  implements  Filter   {    @Override      public  void  init (FilterConfig filterConfig)  throws  ServletException  {         System.out.println("AnonymousFilter init..." );     }     @Override      public  void  doFilter (ServletRequest request, ServletResponse response, FilterChain chain)  throws  IOException, ServletException  {         System.out.println("AnonymousFilter doFilter..." );         chain.doFilter(request, response);     }     @Override      public  void  destroy ()   {         System.out.println("AnonymousFilter destroy..." );     } } 
 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 public  class  FormAuthenticationFilter  implements  Filter   {    @Override      public  void  init (FilterConfig filterConfig)  throws  ServletException  {         System.out.println("AnonymousFilter init..." );     }     @Override      public  void  doFilter (ServletRequest request, ServletResponse response, FilterChain chain)  throws  IOException, ServletException  {         System.out.println("AnonymousFilter doFilter..." );         chain.doFilter(request, response);     }     @Override      public  void  destroy ()   {         System.out.println("AnonymousFilter destroy..." );     } } 
 
用枚举将过滤器管理起来 
 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 package  com.example.demo.shiro;import  org.springframework.objenesis.instantiator.util.ClassUtils;import  javax.servlet.Filter;public  enum  DefaultFilter   {    anon(AnonymousFilter.class),     authc(FormAuthenticationFilter.class);     private  final  Class<? extends Filter> filterClass;     private  DefaultFilter (Class<? extends Filter> filterClass)   {         this .filterClass = filterClass;     }     public  Filter newInstance ()   {         return  (Filter) ClassUtils.newInstance(this .filterClass);     } } 
 
创建过滤器管理器 
 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 package  com.example.demo.shiro;import  javax.servlet.Filter;import  javax.servlet.FilterConfig;import  javax.servlet.ServletException;import  java.util.LinkedHashMap;import  java.util.Map;public  class  DefaultFilterChainManager   {    private  FilterConfig filterConfig;     private  Map<String, Filter> filters;     public  DefaultFilterChainManager ()   {         this .filters = new  LinkedHashMap<String, Filter>();         addDefaultFilters(false );     }     public  DefaultFilterChainManager (FilterConfig filterConfig)   {         this .filters = new  LinkedHashMap<String, Filter>();         setFilterConfig(filterConfig);         addDefaultFilters(true );     }     private  void  addDefaultFilters (boolean  init)   {         for  (DefaultFilter defaultFilter : DefaultFilter.values()) {             addFilter(defaultFilter.name(), defaultFilter.newInstance(), init, false );         }     }     public  Map<String, Filter> getFilters ()   {         return  filters;     }     protected  void  addFilter (String name, Filter filter, boolean  init, boolean  overwrite)   {         Filter existing = getFilter(name);         if  (existing == null ) {             if  (init) {                 initFilter(filter);             }             this .filters.put(name, filter);         }     }     public  Filter getFilter (String name)   {         return  this .filters.get(name);     }     protected  void  initFilter (Filter filter)   {         FilterConfig filterConfig = getFilterConfig();         if  (filterConfig == null ) {             throw  new  IllegalStateException("FilterConfig attribute has not been set.  This must occur before filter "  +                     "initialization can occur." );         }         try  {             filter.init(filterConfig);         } catch  (ServletException e) {             throw  new  RuntimeException(e);         }     }     public  FilterConfig getFilterConfig ()   {         return  filterConfig;     }     public  void  setFilterConfig (FilterConfig filterConfig)   {         this .filterConfig = filterConfig;     } } 
 
测试 
 
1 2 3 4 5 6 7 public  class  FilterTest   {    public  static  void  main (String[] args)   {         DefaultFilterChainManager defaultFilterChainManager = new  DefaultFilterChainManager();         System.out.println(defaultFilterChainManager.getFilters());      } } 
 
spring中集成自定义的 FilterChain 
 
一般我们想在spring中注入过滤器,会通过xml或者代码bean注入。这里我们用xml演示, 代码节选自 shiro
1 2 3 4 5 6 7 8 9 <filter >     <filter-name > ShiroFilter</filter-name >      <filter-class > org.apache.shiro.web.servlet.ShiroFilter</filter-class >  </filter > <filter-mapping >     <filter-name > ShiroFilter</filter-name >      <url-pattern > /*</url-pattern >  </filter-mapping > 
 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 public  class  ShiroFilter  extends  AbstractShiroFilter   {         @Override      public  void  init ()  throws  Exception  {         WebEnvironment env = WebUtils.getRequiredWebEnvironment(getServletContext());         setSecurityManager(env.getWebSecurityManager());         FilterChainResolver resolver = env.getFilterChainResolver();         if  (resolver != null ) {             setFilterChainResolver(resolver);         }     } } 
 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 public  class  FilterChainResolver   {    private  DefaultFilterChainManager filterChainManager;     public  FilterChainResolver ()   {         this .filterChainManager = new  DefaultFilterChainManager();     }     public  FilterChainResolver (FilterConfig filterConfig)   {         this .filterChainManager = new  DefaultFilterChainManager(filterConfig);     }     public  FilterChain getChain (ServletRequest request, ServletResponse response, FilterChain originalChain)   {         DefaultFilterChainManager filterChainManager = getFilterChainManager();                  return  null ;     }     public  DefaultFilterChainManager getFilterChainManager ()   {         return  filterChainManager;     } } 
 
  最后 
本文到此结束,感谢阅读。如果您觉得不错,请关注公众号【当我遇上你】,您的支持是我写作的最大动力。