如果在页面加载时没有在会话中找到登录详细信息,我正尝试将用户重定向到第A页的网站登录页面。我正在使用servlet。
从第A页开始,我在页面加载时将最基本的AJAX调用发送到我的servlet,如下所示:
$.ajax({
url: "/bin/website/protectedpage.html",
success: function(){
}
});
但是,我只能通过上述方法获得以下结果:
1
response.sendRedirect("/content/website/en/login.html");
导致HTTP代码302响应,但实际上没有重定向。此外,响应正文中没有返回任何内容。
2
ServletContext context= getServletContext();
RequestDispatcher rd= context.getRequestDispatcher("content/website/en/login.html");
rd.forward(request, response);
导致响应代码200返回响应正文中的整个登录页面HTML,但仍然没有将用户重定向到登录页面。
我错过了什么?请帮我一样。提前谢谢。
答案 0 :(得分:2)
$.ajax()
对服务器执行异步HTTP调用。仅从服务器重定向呼叫也不会在浏览器上重定向。在前端本身的ajax调用之后,你必须处理重定向。
您可以尝试这样的事情
$.ajax({
type: "POST",
url: URL,
data: reqBody,
dataType: "json",
success: function(data, textStatus) {
if (data.redirect) {
// Redirect here
window.location.href = data.redirect;
}
else {
// No redirection.
}
}
});
PS:从here复制的代码块。
答案 1 :(得分:0)
您可以使用window.location.replace("url")
(模拟HTTP重定向)。
如果ypu更喜欢,您可以使用window.location.href = "url"
。这类似于点击链接。
函数replace()不会将原始页面保留在会话历史记录中,因此用户无法陷入永无止境的后退按钮。对我来说,replace()是最好的选择。
答案 2 :(得分:0)
你会尝试过像
这样的东西吗?function_name(funct) { return function(data) { if($("#myForm", data).size() > 0) top.location.href="login"; else funct(data); } }
例如
function sample(data, funct){
if($("#myForm", data).length > 0)
top.location.href="login.htm";//redirection
else
funct(data);
}
然后,在进行Ajax调用时,我们使用了类似的东西:
$.post("myAjaxHandler",
{
param1: sam,
param2: kari
},
function(data){
sample(data, myActualCB);
},
"html"
);
所有Ajax调用总是在我们用来替换页面的DIV元素中返回HTML。此外,我们只需要重定向到登录页面。 我们之间基本上有一个ISA服务器,它监听所有请求并使用302和位置标头响应我们的登录页面。 现在检查状态302,如上所述,您将收到响应302
$(document).ajaxComplete(function(e, xhr, settings){
if(xhr.status === 302){
var loginPageRedirectHeader = xhr.getResponseHeader("LoginPage");
if(loginPageRedirectHeader && loginPageRedirectHeader !== ""){
window.location.replace(loginPageRedirectHeader); //check for location header and redirect...
}
});