你的位置:首页 > 软件开发 > Java > org.springframework.web.filter.DelegatingFilterProxy的作用

org.springframework.web.filter.DelegatingFilterProxy的作用

发布时间:2017-11-18 17:00:09
一、类结构DelegatingFilterProxy类继承GenericFilterBean,间接实现了Filter,故而该类属于一个过滤器。那么就会有实现Filter中init、doFilter、destroy三个方法。二、代理具体实现  首先我们看int方法,该方法在Gene ...

org.springframework.web.filter.DelegatingFilterProxy的作用

一、类结构

org.springframework.web.filter.DelegatingFilterProxy的作用

DelegatingFilterProxy类继承GenericFilterBean,间接实现了Filter,故而该类属于一个过滤器。那么就会有实现Filter中init、doFilter、destroy三个方法。

二、代理具体实现

  首先我们看int方法,该方法在GenericFilterBean类中实现,具体功能是,将该类封装成spring特有形式的类,方便spring维护,并且调用initFilterBean方法,该方法放在子类(DelegatingFilterProxy)实现,该方法主要目的是,找到在spring中维护的目标filter,具体实现看下面代码:

/**  * Standard way of initializing this filter. * Map config parameters onto bean properties of this filter, and * invoke subclass initialization. * @param filterConfig the configuration for this filter * @throws ServletException if bean properties are invalid (or required * properties are missing), or if subclass initialization fails. * @see #initFilterBean */@Overridepublic final void init(FilterConfig filterConfig) throws ServletException { Assert.notNull(filterConfig, "FilterConfig must not be null"); if (logger.isDebugEnabled()) {  logger.debug("Initializing filter '" + filterConfig.getFilterName() + "'"); } this.filterConfig = filterConfig; // Set bean properties from init parameters. try {  PropertyValues pvs = new FilterConfigPropertyValues(filterConfig, this.requiredProperties);  BeanWrapper bw = PropertyAccessorFactory.forBeanPropertyAccess(this);  ResourceLoader resourceLoader = new ServletContextResourceLoader(filterConfig.getServletContext());  bw.registerCustomEditor(Resource.class, new ResourceEditor(resourceLoader, this.environment));  initBeanWrapper(bw);  bw.setPropertyValues(pvs, true); } catch (BeansException ex) {  String msg = "Failed to set bean properties on filter '" +   filterConfig.getFilterName() + "': " + ex.getMessage();  logger.error(msg, ex);  throw new NestedServletException(msg, ex); } // Let subclasses do whatever initialization they like. initFilterBean(); if (logger.isDebugEnabled()) {  logger.debug("Filter '" + filterConfig.getFilterName() + "' configured successfully"); }}

 

@Overrideprotected void initFilterBean() throws ServletException { synchronized (this.delegateMonitor) {  if (this.delegate == null) {   // If no target bean name specified, use filter name.   if (this.targetBeanName == null) {    this.targetBeanName = getFilterName();   }   // Fetch Spring root application context and initialize the delegate early,   // if possible. If the root application context will be started after this   // filter proxy, we'll have to resort to lazy initialization.   WebApplicationContext wac = findWebApplicationContext();   if (wac != null) {    this.delegate = initDelegate(wac);   }  } }}

  

protected final String getFilterName() { return (this.filterConfig != null ? this.filterConfig.getFilterName() : this.beanName);}

  

protected Filter initDelegate(WebApplicationContext wac) throws ServletException { Filter delegate = wac.getBean(getTargetBeanName(), Filter.class); if (isTargetFilterLifecycle()) {  delegate.init(getFilterConfig()); } return delegate;}
到这里我们可以看出来,我们要代理的filter其实就是我们配置filter中的filter-name标签中的filterName了
<filter-name>filterName</filter-name>

我们在来看看doFilter方法具体实现:
@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)  throws ServletException, IOException { // Lazily initialize the delegate if necessary.  Filter delegateToUse = this.delegate; if (delegateToUse == null) {  synchronized (this.delegateMonitor) {   if (this.delegate == null) {   WebApplicationContext wac = findWebApplicationContext();   if (wac == null) {    throw new IllegalStateException("No WebApplicationContext found: no ContextLoaderListener registered?");   }   this.delegate = initDelegate(wac);   }   delegateToUse = this.delegate;  } } // Let the delegate perform the actual doFilter operation.  invokeDelegate(delegateToUse, request, response, filterChain);}
protected void invokeDelegate(  Filter delegate, ServletRequest request, ServletResponse response, FilterChain filterChain)  throws ServletException, IOException {  delegate.doFilter(request, response, filterChain);}
看到这里我相信大家都明白DelegatingFilterPoxy是怎么回事了吧。下面我们看看spring+shiro是如何运用这个类的

三、运用
  首先我们看web.
 <!-- Shiro Security filter-->  <filter>   <filter-name>shiroFilter</filter-name>   <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>   <init-param>    <param-name>targetFilterLifecycle</param-name>    <param-value>true</param-value>   </init-param>  </filter>  <filter-mapping>   <filter-name>shiroFilter</filter-name>   <url-pattern>/*</url-pattern>   <dispatcher>REQUEST</dispatcher>   <dispatcher>ERROR</dispatcher>  </filter-mapping>
 spring对于代理filter配置
<bean id="shiroFilter" />
  第一次写博客,存在很多不足,希望大家见谅。
 

 

原标题:org.springframework.web.filter.DelegatingFilterProxy的作用

关键词:Spring

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

可能感兴趣文章

我的浏览记录