Shiro笔记五(缓存、Rememberme):

五、缓存

25. Shiro_缓存

Shiro笔记五(缓存、Rememberme):_第1张图片

CacheManagerAware是个接口。如果实现了这个接口,shiro就会自动的把CacheManager注入给对象Realm。那么Realm对象就可以自动的使用缓存了。

 

点开Realm继承的父类,一直找到父类CachingRealm,可看到它是实现了这个接口的,所以说我们的Realm是默认有缓存的。

 

下面看一下实际的效果。以授权为例,在ShiroRealm的授权方法的83行处打上断点跑起来,登陆后点击需要授权的那个页面,第一次进入断点我们过,然后当我们第二次再点击授权页面的时候不会再进入到断点了,说明数据已经被缓存了不需要再调授权方法。

要看没有配缓存的时候第二次访问会再调用授权方法,我们就在applicationContext.xml中将缓存给注释掉,SecurityManager中也要注掉。再如上操作就可看到第二次调方法进入断点。

 

在我们配置realm的时候,也可以指定缓存对应的一些属性,比方缓存的名字、是否使用缓存。在ehcache.xml配置文件中做了一些配置,比如授权时使用的缓存策略,认证时用的缓存策略这些都可以进行指定和配置。

 

下面的session缓存使用方式也是差不多的。前面也讲过了。实际开发中可能会用redis来做shiro的缓存。

Shiro笔记五(缓存、Rememberme):_第2张图片

 

六、Rememberme

26. Shiro_认证和记住我的区别

Shiro笔记五(缓存、Rememberme):_第3张图片

说白了就是把Cookie写到客户端,但是在一些敏感页面还是需要身份验证的。

认证和记住我的区别:认证一定是调了Subject.login()来认证成功。而记住我是通过Subject.isRemembered()进行。二者只能选择一个,在访问的时候要么是被认证的要么是被记住的,不可能两个都为true。

 

Shiro笔记五(缓存、Rememberme):_第4张图片

 

Shiro笔记五(缓存、Rememberme):_第5张图片

 

27. Shiro_实现Rememberme

首先还是看一下shiro自带的这些过滤器

Shiro笔记五(缓存、Rememberme):_第6张图片

其中user表示认证和记住我都可以的, 下面就用到它。

 

首先在applicationContext.xml中配置user过滤器,之前已经将配置转到builder里面了,所以就在builder类中添加上一个配置,只要是通过记住我或者认证的都可以对list.jsp访问

map.put("/list.jsp", "user");

并且user.jsp和admin.jsp必须是通过认证,同时具有相应的权限才能访问。

map.put("/user.jsp", "authc,roles[user]");
map.put("/admin.jsp", "authc,roles[admin]");

 

然后具体的实现,打开ShiroHandler类:其中38行的

token.setRememberMe(true);

 

然后把项目跑起来:

在chrome中登录后是经过认证的,页面都可以访问,然后将浏览器关闭。

重新打开浏览器直接进入到list.jsp页面,可以进入没问题。但是当点击Admin链接和user链接想跳转到对应页面的时候就不行,会重新跳回登录页面,因为此时这2个页面设置的是需要认证登录才能访问的。

 

注意的一些小问题:

记住我的时间怎么设置,默认的时间是多长。

通过在ShiroRealm类中认证方法的第一行处打断点,往前面步骤中并找到SecurityManager里面this对象中有remembermeManager属性,中的cookie的maxAge可以看到,就可以在applicationContext.xml配置中设置这个对应的时间属性(SecurityManager的remembermeManager的cookie属性的maxAge属性)。

id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
    name="cacheManager" ref="cacheManager"/>
    name="authenticator" ref="authenticator">
   
    name="realms">
      
         bean="jdbcRealm"/>
         bean="secondRealm"/>
      

   

    name="rememberMeManager.cookie.maxAge" value="20">

 

 

验证方法:

登录后复制http://localhost:8080/list.jsp地址,关闭浏览器,在10秒内打开页面不用登录就可以进,但是关掉页面10秒后再打开这个页面,就需要重新登录了,因为cookie已经失效了,验证不通过就跳转登录页面了。

 

 

你可能感兴趣的:(Shiro)