failureForwardUrl和failureUrl混淆使用带来的坑

1. 现象:

Spring Security,用户名和密码正确,能够自动跳转成功。但是, 用户名密码错误,错误页面跳转失败。

补充:
Spring Security自定义登录页面,表单认证错误后,前端没接收到“?error”。但是,表单输入正确的账户和密码,可以正常认证且跳转到defaultSuccessUrl的路径,而表单的账户密码错误,前端没能根据下图${param.error}做出响应。

在这里插入图片描述

2. 核心代码:

后端自定义登录(正式由于采用方式一导致出现本次的现象)
在这里插入图片描述
后端控制器
在这里插入图片描述
前端表单
在这里插入图片描述
补充说明:
登录认证是采用自定义jdbc登录认证。


3. 探讨

现在来探讨下方式一和方式二的区别,究竟是如何出现本次的现象的。

方式一:failureForwardUrl(“/userLogin?error”);

过程1
①输入错误的用户名或密码,提交登录。

IDEA有打印出提示信息,Request method “POST” not supported。
在这里插入图片描述
②通过谷歌浏览器的F12调试,抓获的请求过程如下
在这里插入图片描述
在这里插入图片描述

分析:用表单以POST方式提交错误的账户或密码,spring security默认使用Post方式的“/login”请求用于对登录后的数据处理,这里采用了自定义的登录页面和登录请求,也就是/userLogin。则spring security会处理该登录表单的数据。由于是错误的账户或密码,所以认证不通过。由于在http.formLogin()中指定了认证失败的重定向路径,同时会响应重定向的状态码302。那浏览器会根据响应头的Location进行再次请求。

过程2
①接受到状态码302,浏览器根据Location再次进行请求。

在这里插入图片描述

分析,根据重定向响应头的Location再次进行请求,且请求成功,再次跳转登录页。但由于重定向响应头的Location中的url是http://localhost:8080/userLogin,没有failureForwardUrl(“/userLogin?error”)中指定的”?error”,导致前端页面没能响应“账户或密码错误“。

扫描二维码关注公众号,回复: 11602268 查看本文章

方式二:failureUrl(“/userLogin?error”);

过程1:
①输入错误的用户名或密码,提交登录。
IDEA正常,没有打印任何提示信息。

②通过谷歌浏览器的F12调试,抓获的请求过程如下
在这里插入图片描述

分析:根据现象一的分析,这里同样根据Location进行再次请求,但注意,这里Location的url带有failureForwardUrl(“/userLogin?error”)中的”?error”,这样一来。浏览器会再次根据请求服务器,但这次的url是http://location:8080/userLogin?error;

过程2
①接受到状态码302,浏览器自动再次进行请求。
在这里插入图片描述

分析,同样根据重定向响应头的Location再次进行请求,且请求成功,再次跳转登录页。但这次重定向响应头的Location中的url已变化,带有”?error”。因此,前端页面正常响应“账户或密码错误“。


小结:

failureForwardUrl()与failureUrl()

相同的地方:
spring security认证失败后,都进行了重定向,再次请求userLogin,且都是以GET的方式再次请求的。

不同的地方:
failureForwardUrl(“/userLogin?error”),重定向响应的Loaction中没有(”?error”)。
failureUrl(“/userLogin?error”),重定向后响应的Location中是带有(“?error”)的。

问题:那究竟是为什么方式一响应的Location是没有带上参数,且IDEA会打印Request method “POST” not supported的呢?

— 先记下此次过程,等待解决该问题。

猜你喜欢

转载自blog.csdn.net/sgx5666666/article/details/106600293