Shiro13-Shiro 整合开发-缓存

解决授权频繁查询数据库问题

缓存流程

shiro 中提供了认证信息和授权信息的缓存.
注意: shiro 默认关闭认证信息缓存, 但是对于授权信息的缓存默认是开启的.

用户认证通过.
该用户第一次授权: 调用 realm 查询数据库.
该用户第二次授权: 不调用 realm 查询数据库, 直接从缓存中取出授权信息(权限标识符).

使用 ehcache

在 spring-shiro.xim 中配置 cacheManager



    
    
    




    

创建shiro-ehcache.xml


    
    
    
        maxElementsInMemory="1000" 
        
        maxElementsOnDisk="10000000"
        
        eternal="false" 
        
        overflowToDisk="false" 
        
        diskPersistent="false"
        
        timeToIdleSeconds="120"
        
        timeToLiveSeconds="120" 
        
        diskExpiryThreadIntervalSeconds="120"
        
        memoryStoreEvictionPolicy="LRU">
    

缓存清空

如果用户正常退出, 缓存自动清空.
如果用户非正常退出, 缓存自动清空.

如果我们修改了权限, 而且用户不退出系统, 修改的权限无法立即生效.
那么如何在修改了权限之后立即生效呢?
实现思路: 在权限修改后调用 realm 的 clearCached() 方法进行清除缓存.

//清除缓存
public void clearCached() {
    PrincipalCollection principals = SecurityUtils.getSubject().getPrincipals();
    super.clearCache(principals);
}

验证码

自定义FormAuthenticationFilter

public class CustomFormAuthenticationFilter extends FormAuthenticationFilter {

    //原FormAuthenticationFilter的认证方法
    @Override
    protected boolean onAccessDenied(ServletRequest request,
            ServletResponse response) throws Exception {
        //在这里进行验证码的校验
        
        //从session获取正确验证码
        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
        HttpSession session =httpServletRequest.getSession();
        //取出session的验证码(正确的验证码)
        String validateCode = (String) session.getAttribute("validateCode");
        
        //取出页面的验证码
        //输入的验证和session中的验证进行对比 
        String randomcode = httpServletRequest.getParameter("randomcode");
        if(randomcode!=null && validateCode!=null && !randomcode.equals(validateCode)){
            //如果校验失败,将验证码错误失败信息,通过shiroLoginFailure设置到request中
            httpServletRequest.setAttribute("shiroLoginFailure", "randomCodeError");
            //拒绝访问,不再校验账号和密码 
            return true; 
        }
        return super.onAccessDenied(request, response);
    }
}

** 配置自定FormAuthenticationFilter **



    
        
        
        
        
 
        
        
            
                
                
            
        

Shiro13-Shiro 整合开发-缓存_第1张图片

你可能感兴趣的:(Shiro13-Shiro 整合开发-缓存)