springboot 长时间页面不操作 session过期_SpringBoot+SpringSecurity+Thymeleaf认证失败返回错误踩坑记录...

现在企业开发追求快速,Springboot以多种优秀特性引领潮流,在众多使用SpringBoot的企业中,因为SpringSecurity安全框架由于其与spring框架无缝衔接等优秀特性被使用,这里记录一下使用这两个框架以及Thymeleaf模板过程中遇到的一些坑

如果想学习Java工程化、高性能及分布式、深入浅出。微服务、Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级交流:854630135,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给大家。

本人环境:

OS:windows 10

JDK:1.8

IDE:Intellij idea

SpringBoot:1.5.16

SpringSecurity:4.2.8

thymeleaf:3.0.9

初学阶段,我们大都使用表单提交来进行登录,这里我们也采用这种方式

dacf9ada2cb8b5e668d6ebc6251e85b7.png

表单设计大都大同小异,这里就不过多赘述,接下来我们看下后台SpringSecurity的配置

ef65fe13f37bb699429e865edc2cf0d7.png

我这里只配置了一个必要项,相信都看得懂,这样一来登录成功并且跳转到后台主界面是没有问题的,那如果登录失败我想在登录页上显示错误信息呢?

我们知道,Spring Security对于请求是经过一系列Filter进行拦截的,其中用户登录验证这类的处理都是在UsernamePasswordAuthenticationFilter中,它继承自AbstractAuthenticationProcessingFilter。

在AbstractAuthenticationProcessingFilter里面对于登录失败这类异常的处理都在doFilter方法中

769b129a0f2ca3bdce32ba7f398e0cfd.png
215195b0e057c4bace0e833cbe41e743.png

从这段代码我们看到它将捕获的异常都交给unsuccessfulAuthentication来处理,接下来我们看看unsuccessfulAuthentication方法

52cddb79c5bc253c9559f41963333f7e.png

这里看到,最终处理这些异常的是failureHandler的onAuthenticationFailure()方法

这里我们来看看failureHandler是什么

9396649d255ea6a66f5eee04f9535938.png

我们来看SimpleUrlAuthenticationFailureHandler这个类

e7311ca2312a41de382217cc3bbe2196.png

其中这个onAuthenticationFailure()就是错误信息的处理

cfc8b538f0bf302b81b1a828e86314a2.png

这里主要的处理操作是在saveException()方法中

57f358870e9995ee1b65286c3f9c8922.png

这段代码我们可以看出,异常就是保存在session中!最后看下是以什么名称保存的

97d6cfba74512fe43f6b4f8a1b396392.png

到这里我们就知道了,页面上可以通过session获取SPRING_SECURITY_LAST_EXCEPTION来获取异常信息

因为这里session中保存的是AuthenticationException对象,我们再来看下保存的异常对象

5d02cc7e40437ee85f4db0aa8e60b8d4.png

如果想学习Java工程化、高性能及分布式、深入浅出。微服务、Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级交流:854630135,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给大家。

其继承了RuntimeException,相信大家都很熟悉,所以就不过多赘述,这里基本就清楚了,我们从session中获取到该对象后再获取当前对象的message即可

因为对thymeleaf不够熟悉,这里怎么取session呢?

百度之后的结果:${session.SPRING_SECURITY_LAST_EXCEPTION.message} 和 ${sessionScope.SPRING_SECURITY_LAST_EXCEPTION.message}

结果发现都获取不到值

这里在StackOverflow上找到了解决方法

https://stackoverflow.com/questions/14042106/spring-security-sessionscope-appears-to-be-null-when-using-thymeleaf

在该问题下找到了答案

09c48392aa3d8837344184ee1f262c57.png

当然这里需要注意的一个小地方,应该是

a12d41ca0b61e68763c21abc51f4613b.png

(一个单双引号的问题需要注意下,不要直接拷贝过来用了.)

至此,尝试运行项目,页面已经可以显示异常信息了

8623d701af941032437e4445341487a2.png

补充一下,在SpringSecurity中,关于登录的异常有以下几个:

UsernameNotFoundException 用户找不到

BadCredentialsException 坏的凭据

AccountStatusException 用户状态异常它包含如下子类

AccountExpiredException 账户过期

LockedException 账户锁定

DisabledException 账户不可用

CredentialsExpiredException 证书过期

这里的话这些提示信息是可以定制的

6fa4895f751e4976dc8446602c9176d3.png
2b47b1b3a0db0d7354ea4dbd53fd7dd5.png

后面我们将来定制一下这些异常信息,坏的凭证这样的提示太不友好了

欢迎工作一到八年的Java工程师朋友们加入Java高级交流:854630135

本群提供免费的学习指导 架构资料 以及免费的解答

不懂得问题都可以在本群提出来 之后还会有直播平台和讲师直接交流噢

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值