SpringBoot2.x设置Session失效时间及失效跳转方式

 更新时间:2022年03月17日 11:07:13   作者:奇  
这篇文章主要介绍了SpringBoot2.x设置Session失效时间及失效跳转方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

设置Session失效时间及失效跳转

#Session超时时间设置,单位是秒,默认是30分钟
 server.servlet.session.timeout=10

然而并没有什么用,因为SpringBoot在TomcatServletWebServerFactory代码中写了这个

    private long getSessionTimeoutInMinutes() {
        Duration sessionTimeout = this.getSession().getTimeout();
        return this.isZeroOrLess(sessionTimeout) ? 0L : Math.max(sessionTimeout.toMinutes(), 1L);
    }

如果说某些人看不懂 Duration 这个类是什么,我不推荐你接着看下去了,因为没有什么帮助。

Session失效后如何跳转到Session失效地址

package cn.coreqi.security.config; 
import cn.coreqi.security.Filter.SmsCodeFilter;
import cn.coreqi.security.Filter.ValidateCodeFilter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.password.NoOpPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.authentication.AuthenticationFailureHandler;
import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    private AuthenticationSuccessHandler coreqiAuthenticationSuccessHandler;
    @Autowired
    private AuthenticationFailureHandler coreqiAuthenticationFailureHandler;
    @Autowired
    private SmsCodeAuthenticationSecurityConfig smsCodeAuthenticationSecurityConfig;
    @Bean
    public PasswordEncoder passwordEncoder(){
        return NoOpPasswordEncoder.getInstance();
    }
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        ValidateCodeFilter validateCodeFilter = new ValidateCodeFilter();
        validateCodeFilter.setAuthenticationFailureHandler(coreqiAuthenticationFailureHandler);
        SmsCodeFilter smsCodeFilter = new SmsCodeFilter();
        //http.httpBasic()    //httpBasic登录 BasicAuthenticationFilter
        http.addFilterBefore(smsCodeFilter, UsernamePasswordAuthenticationFilter.class)    //加载用户名密码过滤器的前面
                .addFilterBefore(validateCodeFilter, UsernamePasswordAuthenticationFilter.class)    //加载用户名密码过滤器的前面
                .formLogin()    //表单登录 UsernamePasswordAuthenticationFilter
                    .loginPage("/coreqi-signIn.html")  //指定登录页面
                    //.loginPage("/authentication/require")
                    .loginProcessingUrl("/authentication/form") //指定表单提交的地址用于替换UsernamePasswordAuthenticationFilter默认的提交地址
                    .successHandler(coreqiAuthenticationSuccessHandler) //登录成功以后要用我们自定义的登录成功处理器,不用Spring默认的。
                    .failureHandler(coreqiAuthenticationFailureHandler) //自己体会把
                .and()
                .sessionManagement()
                    .invalidSessionUrl("session/invalid")    //session过期后跳转的URL
                .and()
                .authorizeRequests()    //对授权请求进行配置
                    .antMatchers("/coreqi-signIn.html","/code/image","/session/invalid").permitAll() //指定登录页面不需要身份认证
                    .anyRequest().authenticated()  //任何请求都需要身份认证
                    .and().csrf().disable()    //禁用CSRF
                .apply(smsCodeAuthenticationSecurityConfig);
            //FilterSecurityInterceptor 整个SpringSecurity过滤器链的最后一环
    }
}
    @GetMapping("/session/invalid")
    @ResponseStatus(code = HttpStatus.UNAUTHORIZED)
    public SimpleResponse sessionInvalid(){
        String message = "session失效";
        return new SimpleResponse(message);
    }

设置Session失效的几种方式

如果是1.5.6版本

这里可以在application中加上bean文件

package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer;
import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class DemoApplication {undefined
public static void main(String[] args) {
    SpringApplication.run(DemoApplication.class, args);
}
//设置session过期时间
@Bean
public EmbeddedServletContainerCustomizer containerCustomizer() {
    return new EmbeddedServletContainerCustomizer() {
        public void customize(ConfigurableEmbeddedServletContainer container) {
            container.setSessionTimeout(7200);// 单位为S
        }
    };
}
}

还可以设置

application.yml

server:
port: 8081
servlet:
session:
timeout: 60s

@RestController
public class HelloController {undefined
@PostMapping("test")
public Integer getTest(@RequestParam("nyy")String nn, HttpServletRequest httpServletRequest ){
    HttpSession session = httpServletRequest.getSession();
   session.setMaxInactiveInterval(60);
    int maxInactiveInterval = session.getMaxInactiveInterval();
    long lastAccessedTime = session.getLastAccessedTime();
    return maxInactiveInterval;
}
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java Hibernate中的多种查询方式及示例

    Java Hibernate中的多种查询方式及示例

    Hibernate提供了多种查询方式,包括HQL查询、SQL查询、QBC查询和Criteria查询等。HQL查询是基于面向对象的查询语言,可以方便地进行对象导航和多表查询;SQL查询允许用户直接使用SQL语句进行查询;QBC查询是基于Criteria的查询,具有类型安全和可重用性的优势
    2023-04-04
  • IDEA教程创建SpringBoot前后端分离项目示例图解

    IDEA教程创建SpringBoot前后端分离项目示例图解

    在使用spring、mybatis等框架时,配置文件很复杂,有时复杂的让人想放弃Java,使用C#。springboot出现这一切问题就都不是问题
    2021-10-10
  • java字符串中提取数字的方法

    java字符串中提取数字的方法

    Java中提取字符串中的数字,可以使用正则表达式或非正则表达式的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-06-06
  • Mybatis的Cursor避免OOM异常的方法详解

    Mybatis的Cursor避免OOM异常的方法详解

    在Mybatis中,有一个特殊的对象Cursor,这个对象的注释上清晰的说明了,这个类的用途,在Mybatis中使用Cursor非常简单,只要在Mapper文件中将方法的返回值设置成Cursor<T>即可,本文给大家介绍了Mybatis的Cursor避免OOM异常的方法,需要的朋友可以参考下
    2024-06-06
  • JAVA中值类型和引用类型的区别

    JAVA中值类型和引用类型的区别

    在java开发中经常会遇到值类型和引用类型知识,但是有很多朋友不清楚java中值类型和引用类型的区别,今天小编通过本文给大家介绍下
    2017-02-02
  • java语言实现猜数字游戏

    java语言实现猜数字游戏

    这篇文章主要为大家详细介绍了java语言实现猜数字游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • java的异常与处理机制分析【附面试题】

    java的异常与处理机制分析【附面试题】

    这篇文章主要介绍了java的异常与处理机制,结合实例形式分析了Java异常与处理机制的概念、原理、相关操作技巧与注意事项,并附带面试题分析供大家参考,需要的朋友可以参考下
    2019-05-05
  • java中HashMap的七种遍历方式小结

    java中HashMap的七种遍历方式小结

    本文主要介绍了java中HashMap的七种遍历方式小结,包括迭代器,For Each,Lambda,Streams API等,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • Spring中@Value注解的使用方法详解

    Spring中@Value注解的使用方法详解

    这篇文章主要介绍了Spring中@Value注解的使用方法详解,在spring项目中必不可少的就是读取配置文件,那么读取配置文件就有两种方式,一种就是使用Spring中@Value注解,还有一种是使用SpringBoot中的@ConfigurationProperties注解,需要的朋友可以参考下
    2024-01-01
  • 如何用好Java枚举让你的工作效率飞起来

    如何用好Java枚举让你的工作效率飞起来

    在JDK1.5之前没有枚举类型,那时候一般用接口常量来替代,而使用Java枚举类型enum可以更贴近地表示这种常量,下面这篇文章主要给大家介绍了关于如何用好Java枚举让你的工作效率飞起来的相关资料,需要的朋友可以参考下
    2021-09-09

最新评论