code: public void init(final FilterConfig pConfig) throws ServletException {
          if (pConfig == null) {
              throw new ServletConfigException("filter config == null");
          }
  
          // Store filter config
          filterConfig = pConfig;
  
          // Configure this
          try {
              BeanUtil.configure(this, ServletUtil.asMap(pConfig), true);
          }
          catch (InvocationTargetException e) {
              throw new ServletConfigException("Could not configure " + getFilterName(), e.getCause());
          }
  
          // Create run-once attribute name
          attribRunOnce = pConfig.getFilterName() + ATTRIB_RUN_ONCE_EXT;
          log("init (oncePerRequest=" + oncePerRequest + ", attribRunOnce=" + attribRunOnce + ")");
          init();
      }
docs: Called by the web container to indicate to a filter that it is being
  placed into service.
  <p/>
  This implementation stores the {@code FilterConfig} object it
  receives from the servlet container for later use.
  Generally, there's no reason to override this method, override the
  no-argument {@code init} instead. However, <em>if</em> you are
  overriding this form of the method,
  always call {@code super.init(config)}.
  <p/>
  This implementation will also set all configured key/value pairs, that
  have a matching setter method annotated with {@link InitParam}.
  
  @param pConfig the filter config
  @throws ServletException if an error occurs during init
  
  @see Filter#init(javax.servlet.FilterConfig)
  @see #init() init
  @see BeanUtil#configure(Object, java.util.Map, boolean)