我正在尝试开发一个MarkLogic-9采用服务器端JavaScript和HTTP应用服务器的双层Web应用程序。我有一个提示输入用户名/密码的简单页面,并通过Ajax将GET请求发送到应用服务器(应用程序级别认证)。MarkLogic App Server自定义登录页面sessionID Cookie与GET请求
我login.sjs脚本:
//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;
var ret = xdmp.login(username,password);
ret;
登录页面然后重定向到显示基本用户信息的主页。我的问题是,我不知道如何在客户端重定向到主页后保留当前用户的会话。
应用程序服务器具有应用程序级别的身份验证和一个名为Login-User的默认用户,该用户是只具有登录所需权限(xdmp:login)的自定义用户。应用程序服务器托管在localhost:8601上。我发现,当我直接从浏览器运行login.sjs(即输入localhost:8601/login.sjs?username = test_user & password = test_password)时,我的浏览器会获得一个cookie和sessionID。然而,当我通过Ajax GET请求运行login.sjs时,我的浏览器没有得到任何cookie。我不知道这是否是问题,但我可能值得一提。
我仍然是一个MarkLogic新手,所以我可能会以这种完全错误的方式进行讨论。基本上,如何在重定向到新页面后继续单个用户的会话?我是否使用cookie来保存sessionID?我应该在本地存储中保存用户名和密码,并在每次网站调用新的.sjs文件时登录?
为了完整起见,这里是客户端js我使用Ajax调用登录。相当不言自明。如果登录成功,login.sjs文件只返回true/false。
function createLoginEar(){
$("#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: "GET",
url: url,
data: params,
success: function(data){
if(data == "true"){
console.log("worked");
window.location.href = "homepage.html";
} else{
invalidLogin();
}
},
error: function(data){
invalidLogin();
}
})
})
}
的问题是,一旦页面重定向到homepage.html,那里似乎有记录中没有用户的存储器中,当homepage.html调用的任何.sjs文件,用户重置为“登录用户”的默认值。
在此先感谢。
我很抱歉,如果我只是密集,但我已经通读了该部分,并尝试了所有我能想到的,但我仍然无法弄清楚这一点。我会尽量做更明确的事情。在login.html调用login.sjs并成功登录后,它会重定向到homepage.html。当homepage.html调用homepage.sjs(或同一应用程序服务器上的任何其他.sjs文件)时,它会丢失用户登录并恢复为默认用户的事实(在我的情况中为Login-User) 。如何移动到另一个页面而不会丢失登录信息? –
@AlecDaling,xdmp.login调用在MarkLogic中创建用户会话,并使用会话ID设置Cookie。确保它在页面调用之间传递。具有该会话ID的呼叫将在调用之前自动切换到适当的用户。 – grtjn
注意:请记住,此类会话与特定主机绑定。如果您之间有负载平衡器,则需要使用粘滞会话。 – grtjn