SpringSecurity6 | 失败后的跳转

150 阅读2分钟

SpringSecurity6 | 失败后的跳转

image-20231030235443828

1.前言

大家好,我是Leo哥🫣🫣🫣,接到上一节,我们学习通过SpringSecurity登录成功之后的一些页面的跳转。这篇文章我们主要来学习一下SpringSecurity6失败后一些跳转。好了,话不多说让我们开始吧😎😎😎。

2.两种跳转方式

2.1 forward跳转

其实这里失败后的跳转有两种跳转方式,一种是基于forward跳转,地址栏不会发生变化。

.failureForwardUrl("/login.html")//登录失败后的forward跳转

通过上面的图片我们可以发现,我们登录之前访问的hello接口,也就是doLogin,登录失败之后地址栏依旧是doLogin。

2.2 redirect跳转

一种是基于redirect跳转,地址栏会发生变化。

.failureUrl("/login.html") //redirect跳转

通过以上动图可以看出来,我们登录之后之后,跳转到固定的url之后,地址栏发现了变化。

这里failureForwordUrl,failureUrl方法类似于登录成功是的successForwordUrl,defaultSuccessUrl方法。

3.失败信息源码分析

下面我们简单分析一下失败信息的源码。

  • 用户登录认证由SpringSecurity的过滤器类UsernamePasswordAuthenticationFilter 中的 attemeptAuthentication() 方法进行处理,处理过程中的。
  • 异常会抛给他的父类AbstactAuthenticationProcessingFilter中doFilter()方法捕获到AuthenticatonException 异常,调用自己unsuccessfulAuthentication()方法。
  • AbstractAuthenticationProcessingFilter的 **unsuccessfulAuthentication()**方法中,又调用AuthenticationFailureHandler 接口的 onAuthenticationFailure()方法
  • 真正执行的是AuthenticationFailureHandler 接口的实现类 SimpleUrlAuthenticationFailureHandler 中的onAuthenticationFailure()方法。
  • 在**onAuthenticationFailure()**方法中,调用自己的saveException0方法保存异常信息
  • saveException() 方法中,判断如果登录失败跳转时是forward,则往request作用域中存储命名属性。如果失败跳转时是 redirect ,则往sess1on作用域中存储命名居性。
  • requestsession 中存在命名属性时,命名属性的名称是WebAttributes 类中的常量AUTHENTCATION_EXCEPTION 值为 SPRING_SECURITY_LAST_EXCEPTION ;

4.验证

那么如果把错误提示信息响应在我们的页面呢,下面我们来验证一下。

saveException 方法中通过url判断他是转发还是重定向,然后把他存入session或者request作用域。

存入的就是WebAttributes的定义的常量。PRING_SECURITY_LAST_EXCEPTION

在我们的login.html页面加入一行代码即可。

<h4 style="color: red" th:text="${session.SPRING_SECURITY_LAST_EXCEPTION}"></h4>

然后我们在页面上去验证一下具体的效果。

大功告成!!!

5.总结

以上便是本文的全部内容,本人才疏学浅,文章有什么错误的地方,欢迎大佬们批评指正!我是Leo,一个在互联网行业的小白,立志成为更好的自己。

如果你想了解更多关于Leo,可以关注公众号-程序员Leo,后面文章会首先同步至公众号。