一个filter 必须实现javax.servlet.Filter 接口,即实现下面的三个方法: 1: doFilter(ServletRequest, ServletResponse, FilterChain):这是一个完成过滤行为的方法。这同样是上游过滤器调用的方法。引入的 FilterChain 对象提供了后续过滤器所要调用的信息。 
//这里去用你的Hibernate Session,但不要关闭掉它。2: init(FilterConfig):这是一个容器所调用的初始化方法。它保证了在第一次 doFilter() 调用前由容器调用。您能获取在 web.xml 文件中指定的初始化参数。 
//这里初始化你的Hibernat Session3: destroy():容器在破坏过滤器实例前,doFilter()中的所有活动都被该实例终止后,调用该方法。
//这里去关闭掉Hiberanate Session如果在Web应用中,应该放在ServletFilter里面同一closeSession的。如果在页面里面就closeSession,那么肯定就没有发挥ThreadLocal的效果。 我现在写的程序不是Web程序,我也在程序里面不关闭Session的,而是最后统一关闭。 例如: java代码:          public static boolean updateUser(User user) { 
                try { 
                        Session s = ReportSession.currentSession(); 
                        ReportSession.currentTransaction();                        
                        s.update(user); 
                        s.flush();                        
                        return true; 
                } catch (HibernateException e) { 
                        System.out.println(e.getMessage()); 
                        return false; 
                }                
        }

解决方案 »

  1.   

    用spring吧,如果用lazy="true",就结合opensessioninview,非常方便。
      

  2.   

    或者我建议你也可以参考一下opensessioninviewfilter的代码,看看spring是如何实现的。它的原理其实就是:请求时打开session,一直到页面装载完毕后session关闭。
      

  3.   

    对filter不了解,所以回答不了。up一下
    但是楼主的 currentSession()好像有点儿问题。
    改一下:
     public static Session currentSession() throws HibernateException {
            Session session = (Session) threadLocal.get();
            if(session==null){
                session = sessionFactory.openSession();
                threadLocal.set(session);
            }
            return session;
        }