当前位置:首页 > 经验 >

登录状态过期怎么解决(怎么解除未登录状态)

来源:原点资讯(www.yd166.com)时间:2022-11-13 23:35:49作者:YD166手机阅读>>

前言

在上一章节中,一一哥 给各位讲解了HTTP协议、会话、URL重新、会话固定攻击等概念,并且实现了对会话固定攻击的防御拦截。

在Spring Security中,其实除了可以对会话固定攻击进行拦截之外,还可以对会话过期进行处理,也就是会话可能会过期,过期了该怎么处理。接下来请各位跟着 壹哥 继续学习,看看会话过期时到底怎么处理的吧。

一. 会话过期1. 会话过期概念

在处理会话过期之前,我们首先得知道啥是会话过期。

所谓的会话过期,是指当用户登录网站后,较长一段时间没有与服务器进行交互,将会导致服务器上的用户会话数据(即session)被销毁。此时,当用户再次操作网页时,如果服务器进行了session校验,那么浏览器将会提醒用户session超时,导致这个问题的关键词有两个:一个是「长时间」,一个是「未操作」。

2. Session的超时时间

既然会话会过期,就得有个过期时间,默认情况下,Session的过期时间是30分钟,当然我们可以在yml配置文件手动修改会话的过期时间。

server: servlet: session: #会话过期时间默认是30m过期,最少为1分钟 timeout: 60s

另外会话过期时间最少为1分钟,即便我们设置为小于60秒,也会被修正为1分钟,在Spring Boot的TomcatServletWebServerFactory类中,对此有默认实现,源码如下:

private long getSessionTimeoutInMinutes() { Duration sessionTimeout = getSession().getTimeout(); if (isZeroOrLess(sessionTimeout)) { return 0; } return Math.max(sessionTimeout.toMinutes(), 1); } private boolean isZeroOrLess(Duration sessionTimeout) { return sessionTimeout == null || sessionTimeout.isNegative() || sessionTimeout.isZero(); }3. 会话过期时的处理策略

你可能会问,万一会话过期了怎么办呢?别担心!

默认情况下,在会话过期时,Spring Security为我们提供了2种处理策略:

  1. 跳转到某个指定的URL;
  2. 自定义过期策略。
二. 会话过期时的处理策略(一)

在上面的章节中,我给各位介绍了在会话过期时,Spring Security给我们提供了2种处理策略,我们先学习第一种处理策略,即当会话过期时跳转到某个指定的URL,接下来请看代码实现。

1. 配置会话过期时间

为了方便验证测试,我们先把会话的过期时间设置为60秒,这样会话在很短时间内就可以过期。

server: servlet: session: #会话过期时间默认是30m过期,最少为1分钟 timeout: 60s2. 定义测试接口

接下来我们定义几个测试接口,并且定义一个用来处理会话过期的接口“/session/invalid”。

@RestController public class UserController { @GetMapping("/user/hello") public String helloUser() { return "hello, user"; } @GetMapping("/admin/hello") public String helloAdmin() { return "hello, admin"; } @GetMapping("/app/hello") public String helloApp() { return "hello, app"; } @RequestMapping("/logout") public void logout(HttpSession session){ session.invalidate(); System.out.println("logout执行了..."); } //定义一个会话过期后要跳转到的接口 @GetMapping("/session/invalid") public String invalid(){ return "会话过期invalid..."; } }3. 配置跳转到某个URL

我们还是在之前的SecurityConfig类中,进行会话过期效果的配置实现,主要是利用invalidSessionUrl()方法来实现。

@EnableWebSecurity(debug = true) public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/admin/**") .hasRole("ADMIN") .antMatchers("/user/**") .hasRole("USER") .antMatchers("/app/**") .permitAll() .anyRequest() .authenticated() .and() .csrf() .disable() .formLogin() .permitAll() .and() .logout() .logoutUrl("/logout") //注销成功,重定向到该路径下 .logoutSuccessUrl("/login") //使得session失效 .invalidateHttpSession(true) //清除认证信息 .clearAuthentication(true) .and() //进行会话管理 .sessionManagement() .sessionFixation() //设置会话固定防御策略 .migrateSession() //配置会话过期策略 .invalidSessionUrl("/session/invalid"); } @Bean public PasswordEncoder passwordEncoder() { return NoOpPasswordEncoder.getInstance(); } } 4. 启动测试

我们把项目重启,然后访问/user/hello接口,在我们登陆认证成功后就可以正常访问/user/hello接口。

登录状态过期怎么解决,怎么解除未登录状态(1)

这时候如果我们把当前窗口页面关闭,经过60秒后,会话就会过期,等再次访问/user/hello接口,就可以看到如下效果,即跳转到了我们指定的会话过期界面。

登录状态过期怎么解决,怎么解除未登录状态(2)

三. 会话过期时的处理策略(二)

我在上面说了,会话过期之后的处理策略,除了上面跳转到指定的URL方案之外,我们还可以自定义会话过期策略,其代码如下。

1. 自定义MyInvalidSessionStrategy类

我们创建一个MyInvalidSessionStrategy类,实现InvalidSessionStrategy接口,在这里进行会话过期时的处理逻辑。

//我们先定义一个处理会话过期的策略类 public class MyInvalidSessionStrategy implements InvalidSessionStrategy { @Override public void onInvalidSessionDetected(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.setContentType("application/json;charset=utf-8"); response.getWriter().write("session无效"); } }2. 配置自定义过期策略

接下来我们把上面定义的MyInvalidSessionStrategy类,通过invalidSessionStrategy()方法,设置自定义的会话过期策略。

//然后在配置文件中关联处理会话过期策略 @EnableWebSecurity(debug = true) public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/admin/**") .hasRole("ADMIN") .antMatchers("/user/**") .hasRole("USER") .antMatchers("/app/**") .permitAll() .anyRequest() .authenticated() .and() .csrf() .disable() .formLogin() .permitAll() .and() .logout() .logoutUrl("/logout") //注销成功,重定向到该路径下 .logoutSuccessUrl("/login") //使得session失效 .invalidateHttpSession(true) //清除认证信息 .clearAuthentication(true) .and() //进行会话管理 .sessionManagement() .sessionFixation() //设置会话固定防御策略 .migrateSession() //配置会话过期策略 //.invalidSessionUrl("/session/invalid") //设置会话过期策略 .invalidSessionStrategy(new MyInvalidSessionStrategy()); } @Bean public PasswordEncoder passwordEncoder() { return NoOpPasswordEncoder.getInstance(); } }

至此,壹哥就带各位实现了在会话过期时的代码处理方案了,你学会了吗?

栏目热文

为什么登录老是超时怎么解决(为什么会老是登录过期)

为什么登录老是超时怎么解决(为什么会老是登录过期)

现在CF手游的夏日版本新推出了自定义武器模式,很受大家欢迎。但有的玩家发现自己会登陆超时。那么这个问题应该怎么来解决呢?...

2022-11-14 00:02:11查看全文 >>

登录超时要怎么解决(登录时间超时请重新登录什么意思)

登录超时要怎么解决(登录时间超时请重新登录什么意思)

 很多朋友都遇到qq显示登录超时,请检查你的网络防火墙设置等提示,接下来给大家分享qq登录超时解决步骤。  1、打开开始...

2022-11-13 23:13:19查看全文 >>

为什么登录老是超时(为什么会老是登录过期)

为什么登录老是超时(为什么会老是登录过期)

去年,一个亲戚孩子用我家的电脑填志愿。他没有提前选好,打开志愿填报系统登录后,边选边填,12个志愿,72个专业,持续了近...

2022-11-13 23:58:39查看全文 >>

登录超时解决方法(手机登录请求超时怎么解决)

登录超时解决方法(手机登录请求超时怎么解决)

现在大家应该都在体验英雄联盟手游了,这款游戏虽然还没有开国服,但是已经吸引了很多的玩家的青睐,纷纷注册账号体验,但是这也...

2022-11-13 23:20:47查看全文 >>

喜鹊下午4点到5点叫(下午二点多喜鹊叫好吗)

喜鹊下午4点到5点叫(下午二点多喜鹊叫好吗)

落实语文知识,培养语文素养,提高语文成绩!笔者将按照小学语文的教材顺序,逐篇更新,助力孩子的语文学习,持续更新中,请继续...

2022-11-13 23:58:26查看全文 >>

操作超时请重新登录怎么办(登录出现错误请重新登录)

操作超时请重新登录怎么办(登录出现错误请重新登录)

steam登录超时怎么办?超简单解决方法万圣节即将到来,steam游戏平台同样将在10月25日推出尖叫游戏节活动,届时许...

2022-11-13 23:32:26查看全文 >>

用户登录超时怎么办(登录失败用户账户限制如何解决)

用户登录超时怎么办(登录失败用户账户限制如何解决)

《使命召唤19:现代战争2》是由Infinity Ward开发,由动视暴雪发行的第一人称射击游戏。本作是《使命召唤》系列...

2022-11-13 23:26:54查看全文 >>

登录超时怎么处理(登录过于频繁怎么解决)

登录超时怎么处理(登录过于频繁怎么解决)

概述今天主要分享几种Linux系统实现不活动用户登录超时后自动登出的方法。方法一:通过修改.bashrc或.bash_p...

2022-11-14 00:02:55查看全文 >>

为什么登录超时请重新登录(登录超时什么原因)

为什么登录超时请重新登录(登录超时什么原因)

——2013-6-12 5月下旬的一个晚上,看到投审稿平台里有一篇新投递的稿件,立即处理,接着在平台里写信给主编简单说明...

2022-11-13 23:26:32查看全文 >>

登录超时00001如何解决(登录超时00001是什么故障)

登录超时00001如何解决(登录超时00001是什么故障)

Oracle数据库错误代码大全(超详细) ORA-00001:违反唯一约束条件(.) ORA-00017:请求会话以设置...

2022-11-13 23:56:20查看全文 >>

文档排行