SpringSecurity6 | 失败后的跳转
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作用域中存储命名居性。 - 往 request 或 session 中存在命名属性时,命名属性的名称是
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,后面文章会首先同步至公众号。