package li.hibernate;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import li.aop.AopChain;
import li.aop.AopFilter;
import li.ioc.Ioc;
import org.hibernate.Session;
/**
* OpenSessionInViewFilter
*
* @author 明伟
*/
public class OpenSessionInViewFilter implements Filter, AopFilter {
static final ThreadLocal<Session> SESSION_THREADLOCAL = new ThreadLocal<Session>();
private SessionFactory sessionFactory;
public OpenSessionInViewFilter() {
this.sessionFactory = Ioc.get(SessionFactory.class);
}
/**
* for servlet filter
*/
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
SESSION_THREADLOCAL.set(this.sessionFactory.openSession());
filterChain.doFilter(servletRequest, servletResponse);
closeSession(SESSION_THREADLOCAL.get());
}
/**
* for AopFilter
*/
public void doFilter(AopChain chain) {
SESSION_THREADLOCAL.set(this.sessionFactory.openSession());
chain.doFilter();
closeSession(SESSION_THREADLOCAL.get());
}
static void closeSession(Session session) {
if (null != session) {
session.clear();
session.close();
}
}
public void init(FilterConfig filterConfig) throws ServletException {}
public void destroy() {}
}