成功的 ajax 发布到 Spring Security 不会重定向

Posted

技术标签:

【中文标题】成功的 ajax 发布到 Spring Security 不会重定向【英文标题】:Successful ajax post to spring security doesn't redirect 【发布时间】:2013-10-20 15:01:58 【问题描述】:

伙计们,我有一个问题,即对 j_spring_security_check 的成功 ajax POST (200) 请求未正确重定向到 success.jsp 页面 - 该页面与登录页面位于同一目录中。 login.jsp 页面只是重新显示 - 我不知道为什么(请注意,我对 ajax 还很陌生)。

以下是我的 login.jsp 页面的内容。任何帮助都会受到极大的欢迎:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script>
    <%--<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/jquery-ui.min.js"></script>--%>
    <title>Money Tracker - Logon</title>
  </head>

  <body>
      <div>
        <header>
        </header>
        <section>
          <div id="dialog" title="Login">
            <form id="login">
                <label for="userName">User:</label>
                <input id="userName" type="text" name="userName">
                <br>
                <label for="password">Password:</label>
                <input id="password" type="password" name="password">
                <br>
                <label for="rememberMe">Remember me</label>
                <input id="rememberMe" type="checkbox" name="rememberMe"/>
                <br>
               <button type="submit">Login</button>
            </form>
        </div>
    </section>
</div>
<script>

function ajaxLogin(form) 
    var userName = form.userName.value;
    var password = form.password.value;
    var rememberMe = form.rememberMe.value;
    $.ajax(
        cache: false,
        type: 'POST',
        url: "/server/j_spring_security_check",
        crossDomain: true,
        async: false,
        data:  j_username: userName, j_password: password, _spring_security_remember_me: rememberMe ,
        beforeSend: function (xhr) 
            xhr.setRequestHeader("x-ajax-call", "true");
        ,
        success: function (result, xhr) 
            alert("Request was success. Status is: " + xhr.status);
            if (result == "ok") 
                alert("Result was OK. Status is: " + xhr.status);
                window.location.href = "success.jsp";
             else 
                alert("Result was not OK. Status is: " + xhr.status);
                location.href = "loginFailed.jsp";
            

        ,
        error: function (xhr) 
            alert("Error with request. Status is: " + xhr.status);
            location.href = "loginFailed.jsp"
        ,
        complete: function(result) 
        
    );


$(function () 
    $("#login").submit(function () 
        ajaxLogin(this)
    );
);
</script>
</body>
</html>

【问题讨论】:

ajax 请求不会重定向父页面。代替 ajax 请求使用普通的表单提交 嗨coding_idiot,我只需要在登录请求中提交表单吗?正如我向 Vinoth 提到的,这是一个轻量级、无状态、仅基于 REST 的服务器。所以客户端可以是任何东西——我需要一种通用的登录方式。 你试过谷歌搜索Rest Authentication 【参考方案1】:

@Ruaghain 我有一个建议给你。 Ajax 的目的不是提交整个表单,它只是向服务器发送少量请求并在同一页面内加载响应。当我检查您的代码时,您的意图是将页面重定向到成功/失败响应。您为什么不提交表单并根据需要重定向到页面。无论如何,您正在使用服务器端验证来验证用户。希望我对你有所了解..

【讨论】:

嗨维诺特。我只有一个基于 REST 的服务器(没有任何类型的网页),我最终希望能够访问它并向客户端显示数据 - 无论是在浏览器上还是在 android 设备上等等。你的建议仍然是适用的?恐怕我的客户端编程能力还有很多不足之处。 正如我在上面观察到您的回复,您正在使用网络服务来获取您的回复。因此,您可能无法更改服务器中的任何类型的代码(希望如此)。

以上是关于成功的 ajax 发布到 Spring Security 不会重定向的主要内容,如果未能解决你的问题,请参考以下文章

登录后重定向到登录页面

如何在 Spring Boot 中使用 JavaScript、jQuery 的 Ajax 成功时将数字转化为星级?

无法使用 Ajax 将多部分文件从 JSP 传递到 Spring MVC 中的控制器

Spring Boot 桌面独立应用程序中的 Apache Shiro

通过 Ajax 请求时完成 OpenIDConnect 身份验证

Grails Ajax 登录