我正在使用Spring Security +百里香叶来识别我的CSS和JavaScript文件。这些CSS和javascript文件构成了我的前端登录页面,由于特殊原因,我的登录表单位于js文件中,并且我将此文件包含在我的主要html文件中。要验证登录凭据,需要使用如下所示的javascript调用自定义/ POST请求。当按下表单提交按钮时,以下功能将执行。
function submitForm() {
var myHeaders = new Headers();
myHeaders.append("Content-Type", "application/x-www-form-urlencoded");
var urlencoded = new URLSearchParams();
urlencoded.append("username", "<removed>");
urlencoded.append("password", "<removed>");
var requestOptions = {
method: 'POST',
headers: myHeaders,
body: urlencoded,
redirect: 'follow'
};
fetch("http://localhost:8080/userAuth", requestOptions)
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.log('error', error));
}
用于处理成功登录端点的控制器
@Controller
public class LoginSuccessController {
@GetMapping("/login_success")
public String success() {
return "success";
}
}
在浏览器上,我可以推断出身份验证已成功,并且发生了与成功登录端点有关的事情。但是,我的浏览器仍然位于localhost:8080 / login,并且没有重定向到login_success端点。我不知道为什么。非常感谢您的帮助。
答案 0 :(得分:0)
因为您使用了ajax。如果您选中“网络”标签,我相信您会看到带有Location
标头的响应ans 301/302。
编辑:您必须使用纯HTML表单或从JS端手动重定向
编辑2:
fetch("http://localhost:8080/userAuth", requestOptions)
.then(response => response.text())
.then(result => {
// do some stuff with response
location.href = '/my-success-page-after-login'; // <- here is redirect
})
.catch(error => console.log('error', error));
说明:问题是浏览器不遵循AJAX调用的重定向响应。 Ajax调用只会从服务器返回响应(在您的情况下为重定向,带有301/302状态代码),但这不会使浏览器遵循该重定向