使用spring security时,一般会在系统加载是初始化用户、资源等信息到缓存中,但是如果此时用户的数量很大,此时初始化缓存将会造成内存溢出,如果解决该问题,我们可以考虑在系统加载是并不去进行初始化用户数据到缓存中,当用户第一次登录的时候,会调用org.springframework.security.providers.dao.AbstractUserDetailsAuthenticationProvider.java类中的 public Authentication authenticate(Authentication authentication) throws AuthenticationException 方法进行用户的验证(具体可看我另一篇文章:spring security2认证详解说明),在该方法中会先从缓存中获取用户信息,获取不到则会从数据库(也是根据你的配置决定的)读取用户信息,用户信息获取到后,在该方法中会调用this.userCache.putUserInCache(user);来将该用户信息存储到缓存中,这样以后进行验证等操作时就可以直接从缓存中获取用户了。
通过这种在用户第一次登录时缓存用户的操作,一方面可以避免初始化时一次加载造成用户量过大时出现内存溢出等问题,另一方面在缓存的使用中,还可以设置缓存的过期时间,这样当该用户信息在缓存中长期不使用时也可从缓存中清除,避免缓存不够用,这样系统也就能够支撑大量用户。
通过这种在用户第一次登录时缓存用户的操作,一方面可以避免初始化时一次加载造成用户量过大时出现内存溢出等问题,另一方面在缓存的使用中,还可以设置缓存的过期时间,这样当该用户信息在缓存中长期不使用时也可从缓存中清除,避免缓存不够用,这样系统也就能够支撑大量用户。