`
demohawk
  • 浏览: 2555 次
  • 来自: ...
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

hibernate的SaveOrUpdateEventListener和spring的SecurityContextHolder的问题

阅读更多
hibernate 版本是3.6,springSecurity版本是3.0.5,spring版本是3.0.6,问题是
做了一个hibernate的listener,implements了SaveOrUpdateEventListener ,这个类会监控所有调用saveorupdate方法,然后在之前插入我的业务逻辑,如设置创建用户,公司等通用信息。平时也运行正常,但是偶尔会遇到没有插入用户,公司信息的情况,大概10w分之一的概率吧,代码如下:
@SuppressWarnings("serial")
public class AuditListener implements SaveOrUpdateEventListener {

	private static Logger logger = LoggerFactory.getLogger(AuditListener.class);
	public void onSaveOrUpdate(SaveOrUpdateEvent event) throws HibernateException {
		Object object = event.getObject();
		if (object instanceof AuditableEntity
				&& SpringSecurityUtils.getCurrentCustomUser() != null) {
			AuditableEntity entity = (AuditableEntity) object;
			String loginName = SpringSecurityUtils.getCurrentUserName();
			// Long id = getEntityId(entity);
			Long id = entity.getMainid();
			if (id == null) {
				// 创建新对象
				entity.setRecAddTime(new Date());
				entity.setRecLoginUser(loginName);
				entity.setCompanyId(SpringSecurityUtils.getCurrentCustomUser()
						.getCompanyId());
				entity.setSystemId(SpringSecurityUtils.getCurrentCustomUser()
						.getSystemId());
				logger.warn("{}对象(ID:{}) 被 {} 在 {} 创建",
						new Object[] {
						object.getClass().toString(), id,
								loginName, new Date() });
			} else {
				// 修改旧对象
				entity.setRecUpdateTime(new Date());
				entity.setRecModifyUser(loginName);

				logger.warn("{}对象(ID:{}) 被 {} 在 {} 修改",
						new Object[] {
						object.getClass().toString(), id,
						loginName, new Date() });
			}
		}
	}
}


public class SpringSecurityUtils {


	/**
	 * 取得当前用户的User实例, 如果当前用户未登录则返回null.
	 */
	public static CustomerUserDetails getCurrentCustomUser() {
		Authentication authentication = getAuthentication();
		if (authentication != null && authentication.getPrincipal() != null
				&& !authentication.getPrincipal().equals("anonymousUser"))
			return (CustomerUserDetails) authentication.getPrincipal();
		return null;
	}


	/**
	 * 取得Authentication, 如当前SecurityContext为空时返回null.
	 */
	private static Authentication getAuthentication() {
		SecurityContext context = SecurityContextHolder.getContext();
		if (context != null)
			return context.getAuthentication();
		return null;
	}
}



我没有办法验证重复这个过程,hibernate应该不会出问题,只是猜测可能的情况是,用户在调用saveorupdate方法后,由于数据库延时,而导致卡住,但是这个时候,刚好session过期了,通过SecurityContextHolder无法获得用户信息,从而导致了设置用户,公司这个业务的失败,大家能不能帮我分析一下我的猜测是否正确,如何验证,又如何解决。部署在jboss5.01GA下没有这样的问题,但是月前部署在tomcat6.0.18下开始出现问题,会和tomcat有关吗,拿不到session?
分享到:
评论

相关推荐

    acegi与spring、hibernate结合很好的例子

    - Spring通过HibernateTemplate或JpaTemplate提供了对Hibernate的封装,使得在Spring应用中使用Hibernate变得更加简单,避免了直接操作SessionFactory和Session。 - Spring事务管理(PlatformTransactionManager)...

    SpringBoot+SpringSecurity处理Ajax登录请求问题(推荐)

    SpringBoot+SpringSecurity处理Ajax登录请求问题 ...使用SpringBoot+SpringSecurity处理Ajax登录请求问题需要我们了解SpringBoot、SpringSecurity、MyBatis等技术框架,并掌握相关的配置和实现细节。

    spring security3 中文版本

    Spring Security 3.0.1 作为一次 bug 修复版本,虽然没有添加新功能,但通过修正已知问题提高了系统的稳定性和安全性。通过上述知识点的介绍,我们了解了 Spring Security 的核心概念、配置方式以及一些高级特性,这...

    基本的spring mvc + spring security实现的登录(无数据库)

    在本项目中,我们主要探讨的是如何利用Spring MVC和Spring Security框架构建一个基本的无数据库登录系统。Spring MVC是Spring框架的一部分,用于处理Web应用程序的请求-响应模型,而Spring Security则是一个强大的...

    Spring Security in Action

    Spring Security 是一个基于 Java 的安全框架,旨在提供身份验证、授权和访问控制等功能。下面是 Spring Security 的主要知识点: 一、身份验证(Authentication) 身份验证是指对用户身份的验证,以确保用户的...

    spring-security 官方文档 中文版

    Spring Security 最初是由 Luke Taylor 和 Ray Ryan 开发的名为 Acegi Security 的项目,在 2005 年被并入 Spring 项目,并重新命名为 Spring Security。自那时起,Spring Security 经历了多个版本的迭代,不断地...

    spring-security-web源码所需jar包

    例如,我们可以查看`UsernamePasswordAuthenticationFilter`如何处理登录请求,`FilterSecurityInterceptor`如何根据预定义的访问规则决定是否允许访问某个URL,以及`SecurityContextHolder`如何存储和管理当前用户...

    Spring_boot和Spring_Security4整合

    Spring Boot 和 Spring Security 整合是现代Java应用中常见的安全框架集成方式,尤其适用于快速开发微服务架构。Spring Boot 提供了简化配置、快速启动的应用程序开发方式,而 Spring Security 是一个强大的安全管理...

    springsecurity原理流程图.pdf

    Spring Security 是一个功能强大且高度可定制的身份验证和访问控制框架,它是安全领域中Spring生态系统的一部分。Spring Security旨在为Java应用程序提供一个全面的安全解决方案,尤其适用于企业级应用场景。它主要...

    Spring Boot和Spring Security4最新整合实例

    Spring Boot 和 Spring Security 整合实例详解 Spring Boot 是一个快速开发框架,它简化了 Spring 应用的初始搭建以及开发过程。而 Spring Security 是一个强大的安全框架,用于处理身份认证(Authentication)和...

    Spring Boot整合JWT

    Spring Boot作为Java领域中流行的微服务框架,因其便捷的配置和快速的开发体验,被广大开发者所喜爱。而JWT(JSON Web Token)则是一种轻量级的身份验证机制,广泛用于现代Web应用的安全认证。在本项目中,我们将...

    spring-cloud-security例子

    在微服务架构中,安全问题尤为重要,而Spring Cloud Security作为Spring Cloud生态的一部分,为开发者提供了强大的安全管理和身份验证功能。本文将深入探讨Spring Cloud Security在用户身份认证和权限管理方面的应用...

    SpringSecurity+MVC入门Demo

    Spring Security 是一个强大的和高度可定制的身份验证和访问控制框架,常用于保护基于Java的Web应用程序。而Spring MVC是Spring框架的一部分,专门处理Web应用的请求和响应。当这两者结合时,可以构建出安全、高效的...

    SpringSecurity源码

    5. **安全上下文**:理解`SecurityContextHolder`如何存储和管理当前用户的认证信息。 6. **测试**:通过单元测试和集成测试来验证自定义的安全逻辑。 通过以上分析和实践,开发者可以更好地掌握SpringSecurity的...

    Spring Security3.1最新配置实例

    Spring Security 是一个强大的且高度可定制的 Java 安全框架,用于处理Web应用程序的安全性问题。在Spring Security 3.1版本中,该框架提供了一套完善的解决方案来管理认证、授权以及访问控制。这个实例主要展示了...

    spring security实现动态授权

    总的来说,Spring Security的动态授权功能使得权限管理变得更加灵活和高效。通过对源代码的适当修改,我们可以构建一个完全可配置的权限管理系统,适应不断变化的业务需求。这个过程涉及多个组件的定制,但一旦设置...

    spring-security3入门教程

    Spring Security 是一个强大的且高度可定制的身份验证和访问控制框架,广泛用于构建安全的 Java Web 应用程序。本入门教程将带你深入了解 Spring Security 3 的核心概念、配置以及实际应用。 1. **核心概念** - **...

    spring-boot整合security和mybatis-plus代码

    在本文中,我们将深入探讨如何将Spring Boot与Spring Security和MyBatis-Plus进行整合,以便构建一个安全、高效的数据驱动的应用程序。Spring Boot简化了Java应用的开发过程,而Spring Security则为应用程序提供了...

Global site tag (gtag.js) - Google Analytics