OpenSessionInViewFilter类实现,其继承OncePerRequestFilter
通过执行doFilter链,每次请求是打开当前线程绑定的session,如果没有则新建;每个请求只有一个session。
protected boolean isSingleSession() {
return this.singleSession;//默认true
}
@Override
protected void doFilterInternal(
HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
//获取sessionFactory
SessionFactory sessionFactory = lookupSessionFactory(request);
boolean participate = false;
if (isSingleSession()) {
//判断当前请求资源中是否有已有session
// single session mode
if (TransactionSynchronizationManager.hasResource(sessionFactory)) {
// Do not modify the Session: just set the participate flag.
participate = true;
}
else {
logger.debug("Opening single Hibernate Session in OpenSessionInViewFilter");
//打开一个session
Session session = getSession(sessionFactory);
//将session绑定到当前请求的线程池中
TransactionSynchronizationManager.bindResource(sessionFactory, new SessionHolder(session));
}
}
else {
//延迟关闭session
// deferred close mode
if (SessionFactoryUtils.isDeferredCloseActive(sessionFactory)) {
// Do not modify deferred close: just set the participate flag.
participate = true;
}
else {
SessionFactoryUtils.initDeferredClose(sessionFactory);
}
}
try {
filterChain.doFilter(request, response);//继续调用filter链的其他filter
}
finally {
//请求处理完成关闭session
if (!participate) {
if (isSingleSession()) {
// single session mode
SessionHolder sessionHolder =
(SessionHolder) TransactionSynchronizationManager.unbindResource(sessionFactory);
logger.debug("Closing single Hibernate Session in OpenSessionInViewFilter");
closeSession(sessionHolder.getSession(), sessionFactory);
}
else {
// deferred close mode
SessionFactoryUtils.processDeferredClose(sessionFactory);
}
}
}
}
OncePerRequestFilter类的doFilter
public final void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
........//request的处理
if (request.getAttribute(alreadyFilteredAttributeName) != null || shouldNotFilter(httpRequest)) {
// Proceed without invoking this filter...
filterChain.doFilter(request, response);
}
else {
// Do invoke this filter...
request.setAttribute(alreadyFilteredAttributeName, Boolean.TRUE);
try {
[color=red]doFilterInternal(httpRequest, httpResponse, filterChain);//调用其实现的方法OpenSessionInViewFilter[/color]
}
finally {
// Remove the "already filtered" request attribute for this request.
request.removeAttribute(alreadyFilteredAttributeName);
}
}
}
分享到:
相关推荐
OpenSessionInViewFilter个人学习总结
OpenSessionInViewFilter是Spring框架中一个非常重要的组件,主要用于解决数据访问层(DAO)与视图层(View)之间的事务管理问题。在Web应用中,由于HTTP请求的无状态性,一次请求通常由多个Servlet过滤器、控制器和...
我们可以通过配置XML文件和注解来实现整合,并使用opensessionInviewfilter来解决会话问题。 Spring JDBC面向接口编程 本节讲解了如何使用Spring JDBC来实现面向接口编程。我们可以通过配置XML文件和注解来实现DAO...
3. 在使用中如果遇到OpenSessionInView的问题,可以添加OpenSessionInViewFilter或OpenSessionInViewInterceptor。 五、Spring的事务管理 Spring框架提供了事务管理机制,提供了几个关于事务处理的类: 1. ...
- **OpenSessionInView**:解决长时间 HTTP 请求导致的 Hibernate 会话问题,可以使用 OpenSessionInViewFilter 或 OpenSessionInViewInterceptor。 **5. Spring 事务管理** Spring 提供了两种事务管理方式: - *...
- 在`web.xml`中配置`OpenSessionInViewFilter`过滤器,自动管理事务。 #### 三、总结 通过以上步骤,我们不仅可以让Spring有效地管理Struts,实现更灵活的业务逻辑控制,还可以利用Spring的强大功能管理...
4. 解决OpenSessionInView问题,可以使用OpenSessionInViewFilter或OpenSessionInViewInterceptor,确保在一次HTTP请求中保持Hibernate Session的开放状态,以解决懒加载异常。 Spring的事务管理分为编程式和声明式...
- 利用CharacterEncodingFilter和OpenSessionInViewFilter解决编码问题。 通过以上内容的学习,开发者可以深入理解Spring 2.5的核心概念,掌握其在实际开发中的应用,从而提高工作效率和代码质量。
该模式的核心在于通过Spring提供的`OpenSessionInViewFilter`过滤器,在视图渲染过程中保持Hibernate Session的打开状态,从而简化了事务管理,并避免了一些常见的懒加载异常。 #### 一、OpenSessionInViewFilter...
在Web应用中,为了确保每次请求都能获得新的Session,通常会配置openSessionInViewFilter,保证数据操作的正确性。 整合SSH的步骤如下: 1. 引入SSH相关的jar包,确保版本兼容。Struts和Hibernate的jar包可以从IDE...
<filter-class>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter <filter-name>openSessionInViewFilter *.action <!-- Struts2核心过滤器 --> <filter-name>struts2 ...
- 通过OpenSessionInViewFilter保持会话持续时间,确保事务的一致性。 #### 七、Struts2+Spring+Hibernate整合 **整合要点:** - Struts2作为Web层框架。 - Spring作为业务逻辑层框架,负责Bean管理和AOP等功能。 ...
解决这个问题的方法有两种:一种是在 web.xml 中使用 Spring 提供的 OpenSessionInViewFilter,另一种是在 application.xml 中配置 OpenSessionInViewFilter。前者通用,后者只能用于 SpringMVC 结构中。 最后,...
当遇到OpenSessionInView问题时,可以使用OpenSessionInViewFilter或OpenSessionInViewInterceptor来解决。 Spring的事务管理提供了强大且灵活的机制,主要包括编程式和声明式两种方式: 1. 编程式事务管理:通过...
Spring4.0、Struts2.3.15、Hibernate4.2.4、jQuery1.9.1涉及到了诸多开发时的细节:ModelDriven、Preparable 拦截器、编写自定义的类型转换器、Struts2 处理 Ajax、OpenSessionInViewFilter、迫切左外连接、Spring ...
10. **处理Hibernate延迟加载问题**:为了解决由于Session生命周期和HTTP请求生命周期不匹配导致的延迟加载问题,可以使用OpenSessionInViewFilter。这个过滤器确保Session在请求结束时才关闭,从而能正确处理延迟...
在处理Web应用时,Spring提供了一些关键特性,如`CharacterEncodingFilter`和`OpenSessionInViewFilter`,它们对于解决特定问题至关重要。 首先,让我们深入了解一下`CharacterEncodingFilter`。在Web应用中,字符...
<filter-class>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter <param-name>singleSession <param-value>true <filter-name>openSessionInViewFilter <url-pattern>/* ``` ...