当前位置: 首页 > 面试题库 >

在重定向系统中对此cookie感到困惑

阳狐若
2023-03-14
问题内容

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

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

我正在使用Cookie进行重定向。首先,我去了newest.php,然后我单击了按钮(转到thread.php)。然后thread.php看到您尚未登录,然后重定向到signin.php。在我填写登录表单之后,我单击了提交按钮(signin.php),然后即使登录后我仍在signin.php堆栈(不在任何地方),它应该转到thread.php自动。

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

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

在newest.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

问题答案:

我根本不会使用Cookie。

方法1

一种可能的方法是将访问的链接存储到会话变量中,然后当用户到达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");

方法2

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

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

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

但是,这仅在每个页面上都有一个登录框的情况下才是好的。

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

方法3

另一个常用的方法是通过$ _GET变量将用户的当前页面传递到Login表单。

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

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

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

现在检查是否已填充,然后将用户发送至此:login.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" />

登录check.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();
}


 类似资料:
  • 问题内容: 我知道“ ==”比较引用,并且Java字符串是不可变的,并且使用字符串池缓存,但是在这个示例上我仍然感到困惑: 这给了我结果: 我仍然很困惑为什么System.out.println(name1 == name2); 给我一个错误,因为我知道两个值都应该缓存在字符串池中? 问题答案: 因为是final并使用文字字符串初始化,所以它是一个常量表达式。 所以指令 编译为 编译成 因此,在字

  • 我正在尝试提出一种解决方案,它涉及在连接操作之后应用一些逻辑,从多个中的中选择一个事件。这类似于reduce函数,但它只返回1个元素,而不是递增地返回。因此最终结果将是单个(,对,而不是一个 每个键保证只到达一次。 假设像上面这样的连接操作,它用4个生成了1个,成功地连接并收集在。现在,我想做的是,立即访问这些值,并执行一些逻辑以将正确匹配到一个。例如,对于上面的数据集,我需要(,和)。 将为每个

  • 所以我一直在读Kafka的语义学,我对它的工作原理有点困惑。 我理解生产者如何避免发送重复的消息(以防代理的ack失败),但我不明白的是,在消费者处理消息但在提交偏移量之前崩溃的情况下,一次是如何工作的。Kafka不会在这种情况下重试吗?

  • 问题内容: 我已经在eclipse中创建了一个项目,并添加了Maven依赖项。在Eclipse中,它表示我正在使用JRE 1.5。一切在Eclipse中都可以正常运行,例如,我可以运行测试。 当我尝试从终端运行时,出现以下错误。 …在-source 1.3中不支持泛型(使用-source 5或更高版本来启用泛型)… 看来,Maven认为我正在使用JRE 1.3,并且无法识别泛型或for-each循

  • 问题内容: 在碰到此链接http://www.javacodegeeks.com/2013/01/java-thread-pool-example-using- executors-and-threadpoolexecutor 之后,这是我第一次为新项目使用Java线程池。 .html ,我对此更加困惑,这是页面中的代码, 在代码中,创建了一个固定大小的池并创建了10个工作线程,对吗? 线程池应该

  • 问题内容: 与此代码有点混淆。 我在pg-go 仓库中找到了这段代码,不知道为什么这样声明。请解释一下用这种方式声明变量的用例是什么。 问题答案: 这在运行时不会执行任何操作,但是除非类型满足接口要求,否则编译将失败。这是一种静态断言。