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?
分享到:
相关推荐
spring security可以通过SecurityContextHolder.getContext().getAuthentication().getPrincipal()获取到当前用户信息。 而spring oauth2通过SecurityContextHolder.getContext().getAuthentication().getPrincipal...
使用Spring 4.0.x和Gradle 24 2.4.3项目模块 25 核心 - spring-security-core.jar 25 远程处理 - spring-security-remoting.jar 25 Web - spring-security-web.jar 25 配置 - spring-security-config.jar 26 LDAP - ...
5.2.1. SecurityContextHolder, SecurityContext 和 Authentication对象 5.2.1.1. 获得当前用户的信息 5.2.2. UserDetailsService 5.2.3. GrantedAuthority 5.2.4. 小结 5.3. 验证 5.3.1. 什么是Spring ...
这次发布的Spring Security-3.0.1 是一个bug fix 版,主要是对3.0 中存在的一些问题进 行修 正。文档中没有添加新功能的介绍,但是将之前拼写错误的一些类名进行了修正,建议开发 者以这一版本的文档为参考。 ...
5.2.1. SecurityContextHolder, SecurityContext 和 Authentication对象 5.2.1.1. 获得当前用户的信息 5.2.2. UserDetailsService 5.2.3. GrantedAuthority 5.2.4. 小结 5.3. 验证 5.3.1. 什么是Spring ...
主要给大家介绍了关于在Spring Boot2中使用CompletableFuture的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧
springboot_springsecurity_jwt_demo
Authentication和UserDetails的介绍在下面的小节具体讲解,本节重要的内容是介绍SecurityContextHolder这个容器。AuthenticationAuthentication在spring security中是最高级别的身份/认证的抽象。getA
一个示例应用程序,显示了如何允许外部系统通过Spring Security进行身份验证。 在此示例中,我们假设外部系统在请求中添加了一些内容。 该应用程序的工作方式如下: TokenFilter从请求中获取令牌。 当前,这是通过...