shiro配置session会话过期时间,缓存


这里只记录shiro-session会话过期时间及缓存的配置方法,不做整合shiro讨论,shiro整合请参考上篇文章:
https://blog.csdn.net/qq_42944520/article/details/87864543

session会话过期时间设置:
在之前shiroConfig的基础上添加

  // 配置org.apache.shiro.web.session.mgt.DefaultWebSessionManager(shiro session的管理)
    @Bean
    public DefaultWebSessionManager getDefaultWebSessionManager() {
	DefaultWebSessionManager defaultWebSessionManager = new DefaultWebSessionManager();
	defaultWebSessionManager.setGlobalSessionTimeout(1000 * 60);// 会话过期时间,单位:毫秒(在无操作时开始计时)--->一分钟,用于测试
	defaultWebSessionManager.setSessionValidationSchedulerEnabled(true);
	defaultWebSessionManager.setSessionIdCookieEnabled(true);
	return defaultWebSessionManager;
    }


    @Bean(name = "securityManager")
    public DefaultWebSecurityManager getDefaultWebSecurityManager() {
	DefaultWebSecurityManager dwsm = new DefaultWebSecurityManager();
	dwsm.setRealm(realm());// 自定义realm
	//dwsm.setCacheManager(getEhCacheManager());// 启用shiro缓存
	dwsm.setSessionManager(getDefaultWebSessionManager());// session管理
	return dwsm;
    }

启用shiro缓存:
第一种方式: shiro框架自带

@Bean
    protected CacheManager cacheManager() {
	return new MemoryConstrainedCacheManager();
    }

在realm进行缓存设置:
shiro配置session会话过期时间,缓存_第1张图片
在securityManager进行启用:
shiro配置session会话过期时间,缓存_第2张图片
第二种方式: 自定义缓存
添加依赖:

<dependency>
			<groupId>org.apache.shirogroupId>
			<artifactId>shiro-ehcacheartifactId>
			<version>1.4.0version>
		dependency>

添加ehcache-shiro.xml
xml来自网络


<ehcache updateCheck="false" name="shiroCache">
	
	<defaultCache
			maxElementsInMemory="10000"
			eternal="false"
			timeToIdleSeconds="120"
			timeToLiveSeconds="120"
			overflowToDisk="false"
			diskPersistent="false"
			diskExpiryThreadIntervalSeconds="120"
	/>
ehcache>

在shiroConfig进行注入:

 //启用缓存,使用自定义缓存
    @Bean
    public EhCacheManager getEhCacheManager() {
	EhCacheManager em = new EhCacheManager();
	em.setCacheManagerConfigFile("classpath:ehcache-shiro.xml");
	return em;
    }

到此配置就完成了下面是完整的shiroConfig:

shiroConfig:

package com.lcf.shiro.config;

import com.lcf.shiro.realm.MyRealm;

import org.apache.shiro.cache.CacheManager;
import org.apache.shiro.cache.MemoryConstrainedCacheManager;
import org.apache.shiro.cache.ehcache.EhCacheManager;
import org.apache.shiro.realm.Realm;
import org.apache.shiro.spring.web.config.DefaultShiroFilterChainDefinition;
import org.apache.shiro.spring.web.config.ShiroFilterChainDefinition;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;
import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ShiroConfig {

    // 注入自定义的realm,告诉shiro如何获取用户信息来做登录或权限控制
    @Bean
    public Realm realm() {
	MyRealm realm = new MyRealm();
	realm.setCacheManager(getEhCacheManager());// shiro缓存设置
	return realm;
    }

    @Bean
    public static DefaultAdvisorAutoProxyCreator getDefaultAdvisorAutoProxyCreator() {
	DefaultAdvisorAutoProxyCreator creator = new DefaultAdvisorAutoProxyCreator();
	/**
	 * setUsePrefix(false)用于解决一个奇怪的bug。在引入spring aop的情况下。
	 * 在@Controller注解的类的方法中加入@RequiresRole注解,会导致该方法无法映射请求,导致返回404。 加入这项配置能解决这个bug
	 */
	creator.setUsePrefix(false);
	return creator;
    }

    @Bean
    public ShiroFilterChainDefinition shiroFilterChainDefinition() {
	DefaultShiroFilterChainDefinition chain = new DefaultShiroFilterChainDefinition();
	// 访问控制
	chain.addPathDefinition("/html/login.html", "anon");// 可以匿名访问
	chain.addPathDefinition("/login", "anon");// 可以匿名访问
	chain.addPathDefinition("/everybody", "anon");// 可以匿名访问

	// 其它路径均需要登录
	chain.addPathDefinition("/**", "authc");

	return chain;
    }

    // 配置org.apache.shiro.web.session.mgt.DefaultWebSessionManager(shiro session的管理)
    @Bean
    public DefaultWebSessionManager getDefaultWebSessionManager() {
	DefaultWebSessionManager defaultWebSessionManager = new DefaultWebSessionManager();
	defaultWebSessionManager.setGlobalSessionTimeout(1000 * 60);// 会话过期时间,单位:毫秒(在无操作时开始计时)
	defaultWebSessionManager.setSessionValidationSchedulerEnabled(true);
	defaultWebSessionManager.setSessionIdCookieEnabled(true);
	return defaultWebSessionManager;
    }

    @Bean(name = "securityManager")
    public DefaultWebSecurityManager getDefaultWebSecurityManager() {
	DefaultWebSecurityManager dwsm = new DefaultWebSecurityManager();
	dwsm.setRealm(realm());// 自定义realm
	dwsm.setCacheManager(getEhCacheManager());// 启用shiro缓存
	dwsm.setSessionManager(getDefaultWebSessionManager());// session管理
	return dwsm;
    }

    /**
     * shiro注解:
     * 
     * @RequiresGuest 只有游客可以访问
     * @RequiresAuthentication 需要登录才能访问---->可以直接添加到类上
     * @RequiresUser 已登录的用户或“记住我”的用户能访问
     * @RequiresRoles 已登录的用户需具有指定的角色才能访问
     * @RequiresPermissions 已登录的用户需具有指定的权限才能访问
     */

    // 启用shiro缓存:shiro框架自带缓存
    /*@Bean
    protected CacheManager cacheManager() {
	return new MemoryConstrainedCacheManager();
    }*/
    
    //启用缓存,使用自定义缓存
    @Bean
    public EhCacheManager getEhCacheManager() {
	EhCacheManager em = new EhCacheManager();
	em.setCacheManagerConfigFile("classpath:ehcache-shiro.xml");
	return em;
    }

    
}

你可能感兴趣的:(shiro配置session会话过期时间,缓存)