成功登录验证后,Spring Security不会重定向

时间:2020-10-13 09:30:27

标签: spring-boot spring-mvc spring-security ajaxform

我正在使用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端点。我不知道为什么。非常感谢您的帮助。

Browser network activity after submit button

1 个答案:

答案 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状态代码),但这不会使浏览器遵循该重定向