shiro的缓存及session

  • 1. shiro中的缓存
    • 1.1 引入需要的第三方包
    • 1.2 ehcache配置文件
    • 1.2 配置spring的配置文件
  • 2. shiro中的session
    • 2.1 shiro中的session特点和常用方法
    • 2.2 如何使用
    • 2.3 Session监听
    • 2.4 SessionDao

1. shiro中的缓存

在权限验证时每次从数据库中获取权限数据显然是不合适的,更合适方式是将数据缓存到内存,以提高系统性能,shiro中可以方便的配置缓存,具体的配置如下:

1.1 引入需要的第三方包

 <!-- shiro依赖包 -->
<dependency>
	<groupId>org.apache.shiro</groupId>
	<artifactId>shiro-core</artifactId>
	<version>${shiro-version}</version>
</dependency>
<dependency>
	<groupId>org.apache.shiro</groupId>
	<artifactId>shiro-web</artifactId>
	<version>${shiro-version}</version>
</dependency>
<dependency>
	<groupId>org.apache.shiro</groupId>
	<artifactId>shiro-spring</artifactId>
	<version>${shiro-version}</version>
</dependency>

        <!-- 缓存需要的包 -->
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-ehcache</artifactId>
            <version>${shiro-version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>${spring-version}</version>
        </dependency>

1.2 ehcache配置文件

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
         updateCheck="false">

    <diskStore path="java.io.tmpdir"/>
    
    <defaultCache eternal="false" maxElementsInMemory="1000" overflowToDisk="false" diskPersistent="false"
                  timeToIdleSeconds="0" timeToLiveSeconds="600" memoryStoreEvictionPolicy="LRU"/>


    <!--name: Cache的名称,必须是唯一的(ehcache会把这个cache放到HashMap里)-->
   <!--  <cache name="stuCache" eternal="false" maxElementsInMemory="100"
           overflowToDisk="false" diskPersistent="false" timeToIdleSeconds="0"
           timeToLiveSeconds="300" memoryStoreEvictionPolicy="LRU"/> -->
</ehcache>

1.2 配置spring的配置文件

<!-- shiro 缓存-->
<bean id="cacheManagerFactory" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
	<property name="configLocation" value="classpath:ehcache.xml"/>
	<property name="shared" value="true"></property>
</bean>
<bean id="shrioEhcache" class="org.apache.shiro.cache.ehcache.EhCacheManager">
	<property name="cacheManager" ref="cacheManagerFactory"></property>
</bean>

<!-- 将自定义的realm注入到安全管理器中 -->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
	<property name="realm" ref="shiroRealm" />
	<!-- 为安全管理器配置缓存 -->
	<property name="cacheManager" ref="shrioEhcache"></property>
</bean>

2. shiro中的session

2.1 shiro中的session特点和常用方法

shiro的session和httpsession概念上是相同的,指定都是客户端和服务器之间的一次会话。
shiro的session的特点如下:

  • 不依赖于底层的容器(比如Tomcat),httpsession是依赖于底层容器的,这意味中shiro的session可以脱离容器使用
  • 提供了会话管理,会话监听,会话存储等功能, 可以支持会话过期,实现单点登录等。

常用的方法:
Subject.getSession(true/false) 获取session,如果为参数为true,则没有session时会创建session,如果为false则没有session返回空
session.getId() 获取当前会话的ID号
session.getHost() 获取当权会话的主机地址
session.getTimeout() 获取过期时间
session.setTimeout() 设置当前时间
session.getStartTimestamp() 获取会话启动的时间戳
session.getLastAccessTime() 获取会话的最后访问时间
session.touch() 更新最后一次访问时间
session.stop() 销毁会话
session.setAttribute(kay,val)
session.getAttribute(key)
session.removeAttribute(key)

shiro中的session也提供了监听器,和HttpSessionListener类似,提供如下方法:
onStart() -- 监听启动事件
onStop() -- 监听停止事件
onExpiration() -- 监听过期事件

2.2 如何使用

shiro中的session使用起来非常简单,通过设置在HttpSession中的数据,可以在Shiro的Session中直接获取

	//在controller中使用HttpSession来设置属性
	@PostMapping("/user")
    public String getUser(User user, Model model, HttpSession session) {

        session.setAttribute("uname", user.getUsername());
		
		...
	}
@Service
public class SessionService implements ISessionService {

    @Override
    public void testSession() {
		//在service中通过Subject获取session使用,这里的uname属性是通过HttpSession类设置的
        Session session = SecurityUtils.getSubject().getSession();
        System.out.println("===== session : " + session.getAttribute("uname"));
    }
}

如何验证缓存配置的有效性:

  • 首先不配置缓存,在自定义的Realm中输出一些提示信息,启动服务后会发现每次调用登录,或其他配置了权限认证的功能,都会输出提示信息
  • 配置缓存,然后重新运行相同的通过,查看后台,加载一次后及不会再有输出

2.3 Session监听

用于监听session的创建,过期等事件,如果在需要时可以再session创建时做些初始化操作,或在过期时做些清理操作。

1) 创建一个自定义监听器

@Slf4j
public class SessionListener extends SessionListenerAdapter {

    @Override
    public void onStart(Session session) {
        log.info("Shiro session onStart .... ");
    }

    @Override
    public void onStop(Session session) {
        log.info("Shiro session onStop .... ");
    }

    @Override
    public void onExpiration(Session session) {
        log.info("Shiro session onExpiration ....");
    }

}

2)配置文件,在spring配置文件中做如下配置

    <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
        <property name="realm" ref="shiroRealm" />
        <!-- 注入缓存管理器 -->
        <property name="cacheManager" ref="shrioEhcache"/>
        <!-- session管理器 -->
        <property name="sessionManager" ref="sessionManager"/>
    </bean>

    <!-- session管理器 ,配置自定义监听器,同时需要将该sessionManager配置到securityManager中-->
    <bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
        <property name="sessionListeners">
            <list>
                <bean class="com.zking.shirodemo.listener.SessionListener"/>
            </list>
        </property>
    </bean>

2.4 SessionDao

 

实现自定义SessionDao的步骤:

  • 编写自定义的SessionDao,集成自EnterpriseCacheSessionDao
  • 在spring中配置sessionManager,配置示例
    <bean id="sessionManager"  
        class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager"> 
        <!-- 删除失效session -->
        <property name="sessionValidationSchedulerEnabled" value="true" />  
        <!-- session失效时间(毫秒) --> 
        <property name="globalSessionTimeout" value="1800000" />
        <property name="sessionDAO" ref="customShiroSessionDao" />  
    </bean>
  • 在安全管理器中配置sessionManager
    <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
        <!-- 自定义realm -->
        <property name="realm" ref="customRealm" />
        <!-- session管理器 -->
        <property name="sessionManager" ref="sessionManager" />
        <!-- 缓存管理器 -->
        <property name="cacheManager" ref="cacheManager" />
    </bean>
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Shiro-Redis 是一个用于在 Shiro 中实现 Session 共享的插件,它使用 Redis 作为数据存储和缓存,以实现分布式环境下的 Session 共享。 要实现 Shiro-Redis 的 Session 共享,你需要进行以下步骤: 1. 引入 Shiro-Redis 插件依赖:在项目的 Maven 或 Gradle 配置文件中添加 Shiro-Redis 依赖。 2. 配置 Redis 连接信息:在项目的配置文件中配置 Redis 的连接信息,包括主机名、端口号、密码等。 3. 配置 RedisSessionDAO:在 Shiro 的配置文件中配置 RedisSessionDAO,指定使用 Redis 作为 Session 存储和缓存的实现。可以设置过期时间、前缀等参数。 4. 配置 Session Manager:在 Shiro 的配置文件中配置 Session Manager,指定使用自定义的 RedisSessionManager 作为 Session 的管理器。同时,需要将之前配置的 RedisSessionDAO 设置给 RedisSessionManager。 5. 配置 SecurityManager:在 Shiro 的配置文件中配置 SecurityManager,指定使用自定义的 RedisSessionManager 作为 Session 管理器。同时,需要将之前配置的 RedisSessionDAO 设置给 RedisSessionManager。 6. 配置 Filter Chain:在 Shiro 的配置文件中配置 Filter Chain,将自定义的 RedisSessionManager 添加到 Filter Chain 中,以便对请求进行 Session 管理。 通过以上步骤配置完成后,Shiro 将会使用 Redis 进行 Session 的存储和缓存,从而实现 Session 的共享。在分布式环境中,不同应用节点之间可以通过 Redis 共享 Session 数据,从而实现用户的登录状态和会话信息的共享。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值