我正在尝试使用使用服务器端 JavaScript 和 HTTP 应用程序服务器的 MarkLogic-9 开发一个两层 Web 应用程序。我有一个简单的页面,提示输入用户名/密码并通过 Ajax 向应用服务器发送 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),我的浏览器会获取一个带有 sessionID 的 cookie。但是,当我通过 Ajax GET 请求运行 login.sjs 时,我的浏览器没有获得任何 cookie。我不知道这是否是问题,但我认为这可能值得一提。
我仍然是 MarkLogic 的新手,所以我可能会以完全错误的方式来解决这个问题。基本上,在重定向到新页面后如何继续单个用户的会话?我是否使用 cookie 来保存 sessionID?每次网站调用新的 .sjs 文件时,我是否应该将用户名和密码保存在本地存储中并登录?
为了完整起见,这里是我用来进行 Ajax 调用以登录的客户端 js。很不言自明。如果登录成功,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 文件时,用户重置为默认值,即“登录用户”。
提前致谢。