我正在为MarkLogic9应用程序创建自定义登录页面。我在localhost:8601上有一个http应用服务器(服务器端javascript)。 login.sjs页面很简单:

xdmp.addResponseHeader('Access-Control-Allow-Origin', '*');
xdmp.addResponseHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
xdmp.addResponseHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');
xdmp.addResponseHeader('Access-Control-Allow-Credentials', "true");

xdmp.setResponseContentType("text/plain");

//generate object with field names from Request params
var params ={}; //JSON parsed URL parameters
var field_names = xdmp.getRequestFieldNames().toArray();
for(var fname_idx in field_names){
  params[field_names[fname_idx]] = String(xdmp.quote(xdmp.getRequestField(String(field_names[fname_idx]))));
}
//get username and password from passed paramters
var username = params.username;
var password = params.password;
xdmp.login(username,password);


当我直接访问此页面时(即输入localhost:8601 / login.sjs?username = test&password = test),它将成功登录并响应以下标头:

Access-Control-Allow-Credentials:true
Access-Control-Allow-Headers:X-Requested-With,content-type
Access-Control-Allow-Methods:GET, POST, OPTIONS, PUT, PATCH, DELETE
Access-Control-Allow-Origin:*
Connection:Keep-Alive
Content-Length:4
Content-type:text/plain; charset=UTF-8
Keep-Alive:timeout=5
Server:MarkLogic
Set-Cookie:SessionID=917f127921feb6ef; path=/


当我尝试从客户端的login.html页面访问该页面时,会发生问题,该页面发送以下ajax请求”

$("#login-button").click(function(event){
    var un = $("#username").val();
    var pw = $("#password").val();
    if(un){
        params.username = $("#username").val();
    }
    if(pw){
        params.password = $("#password").val();
    }
    event.preventDefault(); //prevent form from clearing
    console.log("input entered");
    $.ajax({
        type: "POST",
        url: url,
        data: params,
        success: function(data){
            alert("login worked");
            if(data == "true"){
                console.log("worked");
                checkUsername();
                //window.location.href = "homepage.html";
            } else{
                alert("login failed");
                invalidLogin();
            }
        },
        error: function(data){
            invalidLogin();
        }
    });
});


这也将成功登录,但是从服务器返回的标头不包含SessionID cookie:

Content-Length:3022
Content-type:text/html
Date:Mon, 12 Jun 2017 08:03:36 GMT
Last-Modified:Mon, 12 Jun 2017 07:03:45 GMT
Server:SimpleHTTP/0.6 Python/2.7.13


我的问题:为什么我的login.html ajax请求页面没有收到来自服务器的Cookie响应标头和/或如何解决?

我的设置:


Marklogic 9
端口8601上的HTTP应用服务器
端口8010(所有localhost)上的python simpleserver
我已经尝试了多个用户(包括admin),所以我不认为这是一个特权问题。


提前致谢。

最佳答案

可能重复,我在另一个帖子中找到了答案。 Get and store cookie (from Set-Cookie) from an AJAX POST response

我只需要在ajax请求中包括以下行:

xhrFields: { withCredentials: true },


由于如果Access-Control-Allow-Origin标头中包含通配符,这将引发错误,因此我还必须更改此行:

xdmp.addResponseHeader('Access-Control-Allow-Origin', '*');


对此:

xdmp.addResponseHeader('Access-Control-Allow-Origin', 'http://localhost:8010');


现在,我的浏览器收集了cookie。

08-06 03:16