springboot thymeleaf 返回html 404_SpringBoot+SpringSecurity+Thymeleaf认证失败返回错误踩坑记录...

本文记录了在SpringBoot应用中整合SpringSecurity和Thymeleaf时,处理登录失败返回404的问题。通过分析SpringSecurity的过滤器流程和异常处理,了解到错误信息存储在session中,但直接通过Thymeleaf取值失败。解决方案来自StackOverflow,注意Thymeleaf中引用session变量的正确方式。此外,文中还提及了SpringSecurity的常见登录异常类型及其定制化提示。
摘要由CSDN通过智能技术生成

现在企业开发追求快速,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

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

444e23c07a021cb1ae8b5ab80aa7b93d.png

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

eb3f24ebcb7de74c0352bc1e0c1b018f.png

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

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

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

6e55fab9d328921a21ec7be26cff9055.png
c3a567671b6e13245e96382448703940.png

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

b0fd441a71d1eaacbf8923fd56fac439.png

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

这里我们来看看failureHandler是什么

819ce7e726ceafe1a9d5ec7d8416129d.png

我们来看SimpleUrlAuthenticationFailureHandler这个类

5f77643f623238ca87ecd7ad8064ac12.png

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

5e4320165b2824f7960a5ca52b24451e.png

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

555adcbf23846b7d04f15cb5d4ac0b45.png

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

e6d77e22788525cfddbfc8e75d378f7a.png

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

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

ed227144df49c44735a09bf9ab4b2936.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

在该问题下找到了答案

9e7b67904ae1926c312dd8bd8e0a1a25.png

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

811c9be225266d62f3d0c18ecf6697a7.png

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

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

1d46abaa659ea4f0e667bd1b01844a0a.png

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

UsernameNotFoundException 用户找不到

BadCredentialsException 坏的凭据

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

AccountExpiredException 账户过期

LockedException 账户锁定

DisabledException 账户不可用

CredentialsExpiredException 证书过期

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

ef3f66d22557b2e4d94b319e3ec7539e.png
2dd482e080539da385fcaa920f98dbe2.png

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值