【问题标题】:confusing about this cookies in redirecting system在重定向系统中对这个 cookie 感到困惑
【发布时间】:2016-02-13 15:50:49
【问题描述】:

我在 PHP 中工作。我想在登录后将页面重定向到我想访问的最后一个页面,但我仍然在 5 小时内在这里堆叠,我还没有做到。这是架构,我有 3 个 php 文件。

newest.php (before login), 
signin.php (before login), 
thread.php (after login). 

我正在使用 cookie 进行此重定向。首先我去了最新的.php,然后我点击了按钮(去thread.php)。然后thread.php看到你还没有登录,然后重定向到signin.php。在我填写登录表单之后,我点击了提交按钮(signin.php),然后我在 signin.php 堆栈(不会去任何地方)即使我已经登录,它应该去 thread.php自动。

这是我在 latest.php 和 thread.php 中的代码(不在 signin.php 中):

$coopage='coopage';
$current_page='http://'.$_SERVER[HTTP_HOST].$_SERVER[REQUEST_URI];
setcookie($coopage, $current_page,time()+86400,'/');

latest.php 中的提交按钮(转到 thread.php):

echo "<center><button onclick=\"window.location='/thread/form'\">add new thread</button></center>"; 

在signin.php中(在我点击提交按钮或提交区域后,因为表单和提交后我在同一页面中)(在页面底部):

if(isset($_COOKIE[$coopage])){
    $url=$_COOKIE[$coopage];
    unset($_COOKIE[$coopage]);
    header('location:'.$url);
}

注意:在 signin.php 中,我在这个 cookie 之前还设置了另一个 cookie,这是造成这种情况的原因吗?或者我是否在一页中设置了 2 个 cookie 是否重要?另一个cookie设置是这样的(在页面顶部)

$cooval2='juna';
setcookie($coousername, $cooval2, time() + (3600 * 24 * 365), "/"); // 1 year

【问题讨论】:

  • 提交按钮上有点击事件处理程序吗?如果没有,请在那里加注星标。
  • 我就是这样echo "
    "; 转到thread.php
  • 对不起伙计,我不太擅长 php,但如果你想要的话,总有一个通过 javascript 的解决方案。
  • 好吧,Zorken 没关系,而不是我在将近 9 个小时后就在这里堆砌,无论哪种方式。
  • @Junaserbaserbi 使用SESSION 而不是cookies

标签: php cookies


【解决方案1】:

您的新 cookie => 本地存储,请确保在您记录 url 的每个页面上都有此代码,登录页面除外,否则它将重定向您回到登录页面。

var currentPage = window.location.href;
localStorage.lastPageVisited = currentPage

这是提交按钮的代码,它将用户重定向到他访问的最后一个页面。

$(document).ready(function() {
    $('button').click(function() {
        window.location.href = localStorage.lastPageVisited;
    });
});

【讨论】:

  • 你可能已经提到 localStorage 是一个 HTML5 功能..只有支持 HTML5 的浏览器才能处理这个
  • 您还需要确保的一件事是您使用的是 HTML5 文档类型。您不应该能够使用具有 HTML5 功能的 XHTML 文档类型。 ,使用此 doctype 不会影响您的浏览器支持。也无需添加 window.localStorage,因为浏览器也只识别 localStorage。
  • @Junaserbaserbi 你知道 HTML5 是什么吗?
  • @coolguy,对 HTML5 的支持可以追溯到很久以前。例如 explorer 8 已经支持它,这是一个相当老的浏览器。
  • 不是佐肯吗?我不太了解 Zorken,从一开始我就没有使用
【解决方案2】:

我根本不会使用 cookie。

方法一

一种可能的方法是将访问的链接存储到会话变量中,然后当用户到达 login.php 页面时,提供一个标头重定向到会话变量给出的 $url。

将此代码粘贴到您网站上的所有页面或主容器中。

<?php
session_start(); 
$_SESSION['url'] = $_SERVER['REQUEST_URI']; 

对于登录页面你可以有:

<?php
session_start();  // needed for sessions.
if(isset($_SESSION['url'])) 
   $url = $_SESSION['url']; // holds url for last page visited.
else 
   $url = "student_account.php"; 

header("Location: http://example.com/$url"); 

方法二

到目前为止,一个更简单的解决方案是:

<hidden name="redirurl" value="<? echo $_SERVER['HTTP_REFERER']; ?>" />

然后在他们登录后重定向到该地址。

但是,只有在每个页面上都有一个登录框时,这才有用。

$_SERVER['REQUEST_URI'] 只会保存当前页面。你想要做的是使用$_SERVER['HTTP_REFERER']。 因此,将 HTTP_REFERER 保存在表单上的隐藏元素中,但还要注意在处理表单的 PHP 中,如果登录失败,您将需要一些逻辑来重定向回登录页面,同时还要检查引用者是否实际上是您的网站,如果不是,则重定向回主页。

方法3

另一种常见的方法是通过 $_GET 变量将用户的当前页面传递给登录表单。

更改您的脚本,这样也可以告诉登录页面记住您的位置:

注意:$_SERVER['REQUEST_URI'] 是您的当前页面

header("Location:login.php?location=" . urlencode($_SERVER['REQUEST_URI']));

现在检查它是否已填充,然后将用户发送到此: 登录.php

echo '<input type="hidden" name="location" value="';
if(isset($_GET['location'])) {
    echo htmlspecialchars($_GET['location']);
}
echo '" />';
//  Will show something like this:
//  <input type="hidden" name="location" value="previousPage.php" />

登录检查.php

session_start();

//  our url is now stored as $_POST['location'] (posted from login.php). If it's blank, let's ignore it. Otherwise, let's do something with it.
$redirect = NULL;
if($_POST['location'] != '') {
    $redirect = $_POST['location'];
}

if((empty($username) OR empty($password) AND !isset($_SESSION['id_login']))) {
    $url = 'login.php?p=1';
    // if we have a redirect URL, pass it back to login.php so we don't forget it
    if(isset($redirect)) {
        $url .= '&location=' . urlencode($redirect);
    }
   header("Location: " . $url);
   exit();
}
elseif (!user_exists($username,$password) AND !isset($_SESSION['id_login'])) {
    $url = 'login.php?p=2';
    if(isset($redirect)) {
        $url .= '&location=' . urlencode($redirect);
    }
   header("Location:" . $url);
   exit();
}
elseif(isset($_SESSION['id_login'])) {
    // if login is successful and there is a redirect address, send the user directly there
    if($redirect)) {
        header("Location:". $redirect);
    } else {
        header("Location:login.php?p=3");
    }
    exit();
}

【讨论】:

  • 哇,你的回答太多了,Darren,等等。我正在消化你的代码。对我来说太难了,但我正在一个一个地尝试。
  • 达伦,方法一,我的大脑可以接受。关于方法 2,我没有在每个页面中都有登录表单。方法3,我的大脑还不能被这个填满,也许我以后再学习它。所以我会选择你的方法 1。但是 Darren,我听说人们告诉 session 是服务器端,用 session 做这件事没有关系吗?但是顺便说一句,你是怎么打字这么快的,我觉得你是多么的惊奇。
  • Darren,方法 1,它有效 Darren,太好了,我喜欢它。我给你 +1 达伦,谢谢你的帮助。
猜你喜欢
  • 2021-08-31
  • 1970-01-01
  • 2021-04-27
  • 1970-01-01
  • 2018-09-29
  • 1970-01-01
  • 2016-11-16
  • 2021-11-28
  • 2018-06-15
相关资源
最近更新 更多