在Spring Session annotation中注入session timeout的属性值

g6baxovj  于 2023-11-16  发布在  Spring
关注(0)|答案(2)|浏览(135)

我有以下类:

@EnableRedisIndexedHttpSession(maxInactiveIntervalInSeconds = 2000)
public class MyApplication {

字符串
我想在maxInactiveIntervalInSeconds中放入一个来自Spring属性文件的值(而不是硬编码的2000)。我不能在那里使用@Value。
你知道吗?
提前感谢!

flvlnr44

flvlnr441#

从技术上讲,它甚至比这简单得多。
我假设你正在使用**Sping Boot **,所以我们将引用3.2.0-RC1 Spring位(Sping Boot 和Spring Session)。早期版本,特别是3.x行,功能应该是相同的。
你肯定不想养成直接扩展Spring Session for Redis,RedisIndexedHttpSessionConfiguration class(Javadoc)的习惯,部分原因是这正是@EnableRedisIndexedHttpSession annotation“imports”(Javadoc)的类,Spring Session和Sping Boot 都让“定制”变得容易。
Spring Boot 方式:
您可以简单地在Sping Boot application.properties中设置以下属性:

# Your Spring Boot / Spring Session application.properties

spring.session.timeout=2000s

字符串
请参阅有关spring.session.timeout属性的Sping Boot 文档。
Sping Boot 使用的fallback属性是:
server.servlet.session.timeout
这从Sping Boot 自动配置(源代码)中可以明显看出。
SPRING SESSION WAY(不带 Spring Boot ):
当你不使用Sping Boot 时,这甚至很简单。只需从Spring Session注册一个类型为SessionRepositoryCustomizerJavadoc)的bean,如下所示:

@EnableRedisIndexedHttpSession
class CustomSpringSessionConfiguration {

    @Bean
    SessionRepositoryCustomizer<RedisIndexedSessionRepository> customizer(
        @Value("${my.session.timeout:2000}") int sessionTimeoutSeconds) {

        return repository -> 
            repository.setDefaultMaxInactiveInterval(sessionTimeoutSeconds);   
    }
}


注意事项:事实上,上面的Spring Session自定义配置代码正是Sping Boot 自己正在做的,当然,考虑到其他Spring [Web [Session]]配置;再次查看完整的源代码。
然后,您的my.session.timeout属性可以从Spring的Environment支持的任何位置配置为“属性源”,包括但不限于:Java系统属性,属性文件,环境变量等,包括您自己的自定义实现,这与Sping Boot 已经为您提供的实现没有什么不同。

nnsrf1az

nnsrf1az2#

正如document所说,
更高级的配置可以扩展RedisIndexedHttpSessionConfiguration。
尝试创建自己的配置来覆盖RedisIndexedHttpSessionConfiguration

@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties(MyRedisSessionProperties.class)
public class CustomRedisIndexedHttpSessionConfiguration extends RedisIndexedHttpSessionConfiguration {

    private final MyRedisSessionProperties myRedisSessionProperties;

    @Autowired
    void customize(MyRedisSessionProperties properties) {
        setMaxInactiveIntervalInSeconds((int) properties.getMaxInactiveInterval().getSeconds());
    }

    @ConfigurationProperties("my.redis.session")
    static class MyRedisSessionProperties {

        private Duration maxInactiveInterval;

        public Duration getMaxInactiveInterval() {
            return this.maxInactiveInterval;
        }

        public void setMaxInactiveInterval(Duration maxInactiveInterval) {
            this.maxInactiveInterval = maxInactiveInterval;
        }

    }
}

字符串
application.property

my.redis.session.max-inactive-interval=1h

相关问题