0

我有一个受密码保护的网站——想象一下像linkedin这样的网站——如果会话到期,系统会提示您再次登录。

但是,有些页面有 ajax 调用,会将内容从服务器加载到 div 中。

如果你在会话过期后回到打开的 div 并尝试输入一些东西,另一端的 php 在 div 内进行重定向,并且基本上将整个登录页面加载到 div 内。这会在页面中创建一个页面,这是一个明显的错误,它告诉用户,该站点无法正常工作。

而不是出现在打开的div中的登录页面,我希望div关闭并且整个页面重定向到登录。但是,我无法做到这一点。

现在我正在使用包含检查会话并允许您继续或将您撞到登录页面的包含进行密码保护。

If ($_SESSION['login'] != '1') {
header("Location: relogin.php"); }

我将此包含在由 ajax 调用触发的脚本中以填充 div,因此用户无法绕过安全性。它是一个包罗万象的包含,还包含一些全局变量、函数等。

我可以添加检测调用是否来自 ajax 或其他东西的代码,以便不进行重定向而是向登录提供消息。或者理想情况下,关闭 div 并重定向整个页面?

因为它是一个大型站点,所以我想找到一个可以进入全局包含的代码块。

将不胜感激任何建议。

4

4 回答 4

0

您将需要在 JS 端进行重定向。

让我们先回顾一下 PHP 方面。您想给您的 AJAX 处理程序一个清晰、明确、有状态的响应:“抱歉,您没有被授权”。让我们借用一下 REST 吧?

每个 AJAX 调用的顶部:

<?php if (!YouAreLoggedIn()) {
header($_SERVER['SERVER_PROTOCOL']." 403 Forbidden");
exit(); ?>

这将向访问者抛出 403 错误,并将终止脚本。jQuery 中的 403 错误算作 XHR 错误,因此您可以独立于其他所有内容进行映射。

您的典型 AJAX 调用将变为:

$.ajax({
  url: "your.url.here.php",
  type: "POST",
  success: function(d) { YourSuccessCallHere(); },
  error: function() { window.location.href='your.redirect.here.php'; }
});

这是最干净的方法。

于 2012-11-18T12:28:15.053 回答
0

您可以通过 User-Agent 或其他标头字段来区分这两个不同的调用。

按照以下链接中的说明使用 setRequestHeader():

JQuery Ajax 请求:更改用户代理

http://www.w3.org/TR/2007/WD-XMLHttpRequest-20070618/#dfn-setrequestheader

于 2012-11-18T12:29:02.270 回答
0

每当您通过 Ajax 调用请求 URL 时,您都可以向请求 URL 添加一个 GET 变量:

myurl.php?ajax=Y

然后在 myurl.php 上,检查它是否是一个 ajax 调用:

if(!isset($_SESSION['login']) || $_SESSION['login'] != '1') {
    if(isset($_GET['ajax'])){
        echo json_encode("Please login!");
        exit;
    }
    else{
        header("Location: relogin.php"); 
        exit;
    }
}
于 2012-11-18T12:29:07.233 回答
0

使用以下标头检查请求是否为 AJAX 请求:

X-Requested-With: XMLHttpRequest

使用以下命令读取 php 中的标头:

$_SERVER['HTTP_X_REQUESTED_WITH'];
于 2012-11-18T12:38:31.627 回答