Question

I have filter executes before servlet:

    public class UserFilter implements Filter {


    List<String> sessionIdsList;

    WebContentDAOIF webContentDAOIF;

        public void setWebContentDAOIF(WebContentDAOIF webContentDAOIF) {
            this.webContentDAOIF = webContentDAOIF;
        }


        @Override
        public void init(FilterConfig arg0) throws ServletException {

                    sessionIdsList = new ArrayList<String>();
                    sessionIdsList = webContentDAOIF.fetchAllSessionIds();

            }


        @Override
        public void doFilter(ServletRequest request, ServletResponse response,
                                                     FilterChain filterChain) throws IOException, ServletException {

            System.out.println("List size: " + sessionIdsList.size());

                HttpServletRequest httpRequest = (HttpServletRequest)request;

                HttpSession session = httpRequest.getSession();
                String userSessionId = session.getId();
                System.out.println("Filter: " + userSessionId);

                if(sessionIdsList.size() !=0 && sessionIdsList.contains(userSessionId)) {

                        System.out.println("There is same sessionID");

                } else {

                    System.out.println("Hello anonim");

                }

                RequestDispatcher dispatcher = request.getRequestDispatcher("main");
                dispatcher.forward(request, response);


        }


        @Override
        public void destroy() {


            }


}

And I have spring context xml file where I declare all my beans:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> 
            <property name="driverClassName"><value>com.mysql.jdbc.Driver</value></property>
            <property name="url"><value>jdbc:mysql://localhost:3306/contentDB</value></property> 
            <property name="username"><value>root</value></property>
            <property name="password" ><value>25051988</value></property>

        </bean>


        <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">

            <property name="dataSource" ref="dataSource"></property>
            <property name="mappingResources">
                <list>
                    <value>user.hbm.xml</value>
                    <value>userEvents.hbm.xml</value>
                </list>
            </property>
            <property name="hibernateProperties">
                <props>

                    <prop key="hibernate.hbm2ddl.auto">update</prop>

                    <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
                    <prop key="hibernate.show_sql">true</prop>
                    <prop key="hibernate.max_fetch_depth">3</prop>
                    <prop key="hibernate.jdbc.fetch_size">50</prop>
                    <prop key="hibernate.jdbc.batch_size">15</prop>
                </props> 

            </property>

        </bean>


        <bean id="webContentDAOImpl" class="demidov.pkg.persistence.WebContentDAOImpl">
            <property name="sessionFactory" ref="sessionFactory"/>
        </bean>


        <tx:annotation-driven/>

        <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
            <property name="sessionFactory" ref="sessionFactory"/>
        </bean>


        <bean id="userFilter" class="demidov.pkg.web.UserFilter">
            <property name="webContentDAOIF" ref="webContentDAOImpl"/>
        </bean>

I also have filter declared in my web.xml:

 <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/*-context.xml</param-value>
      </context-param>

      <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
      </listener>

      <filter>
        <filter-name>userFilter</filter-name>
        <filter-class>demidov.pkg.web.UserFilter</filter-class>
      </filter>

      <filter-mapping>
        <filter-name>userFilter</filter-name>
        <url-pattern>/*</url-pattern>
      </filter-mapping>

      <servlet>
        <servlet-name>initialContentRendering</servlet-name>
        <servlet-class>demidov.pkg.web.InitialContentRendering</servlet-class>
      </servlet>

      <servlet-mapping>
        <servlet-name>initialContentRendering</servlet-name>
        <url-pattern>/main</url-pattern>
      </servlet-mapping>

      <servlet>
        <servlet-name>orderEventServlet</servlet-name>
        <servlet-class>demidov.pkg.web.OrderEventServlet</servlet-class>
      </servlet>

      <servlet-mapping>
        <servlet-name>orderEventServlet</servlet-name>
        <url-pattern>/event</url-pattern>
      </servlet-mapping>

But when I load application it says me:

   SEVERE: Exception starting filter userFilter
    java.lang.NullPointerException
        at demidov.pkg.web.UserFilter.init(UserFilter.java:35)
        at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:273)
        at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:254)
        at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:372)
        at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:98)
        at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4562)
        at org.apache.catalina.core.StandardContext$2.call(StandardContext.java:5240)
        at org.apache.catalina.core.StandardContext$2.call(StandardContext.java:5235)
        at java.util.concurrent.FutureTask.run(FutureTask.java:262)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:724)

Please help me what I'm doing wrong. Thank you folks.

Was it helpful?

Solution

You are going to get 2 different instances of your UserFilter, one managed by Servlet Container, another by Spring - the UserFilter created by the Servlet Container will of course have a null WebContentDAOIF.

The solution is to let Spring manage your UserFilter (and properly inject the WebContentDAOIF). Then use Spring's DelegatingFilterProxy, to handle the filtering which ultimately delegates to your UserFilter.

In your web.xml, remove your UserFilter declaration and declare the DelegatingFilterProxy instead.

<filter>
  <filter-name>userFilter</filter-name>
  <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
  <init-param>
    <param-name>targetBeanName</param-name>
    <param-value>userFilter</param-value>
  </init-param> 
</filter>
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top