POST重定向到GET传递变量而不是URL

时间:2012-12-26 04:53:31

标签: php html

在将POST重定向到GET而不传递URL中的变量时,是否有一种线程安全的方法来传递变量?

我想要实现的是这个。我有一个页面,其中包含一个允许用户上传图像的表单。该表单由浏览器作为POST发送到我的服务器。如果图像上传成功,页面将被重定向到GET,我想在其中显示用户刚刚上传的图像。我可以想到在两个页面之间传递变量的唯一安全方法是通过GET参数。

ImageUpload.php

$imageID = processImageUpload();

if($imageID){
    redirect("/ImageDisplay.php?uploadedImageID=".$imageID)
}

ImageDisplay.php

$uploadedImageID = getRequestVariable('uploadedImageID');
if($uploadedImageID != FALSE){
    //Display the image just uploaded with an 'image uploaded success!' message
}

//Display all the other images

虽然这不是世界上最糟糕的事情,但将变量作为GET参数包含在内有点难看。它也有点误导,好像用户点击重定向页面上的刷新,将看到'图像上传成功!'再次发送消息,即使他们还没有上传图片。

是否存在另一种将变量从POST页面传递到GET页面的线程安全方法?

使用会话或cookie变量并不安全,因为可能会同时上传两张图片,因此可能存在竞争条件。

我以为我可以使用重定向,然后阅读引荐来源标题,例如:

  1. POST到ImageUpload.php,重定向到
  2. GET ImageDisplay.php& uploadedImageID = 123,重定向到
  3. 获取ImageDisplay.php,我将从上一页读取引荐来源 GET请求。
  4. 然而,似乎引用者始终是持有上传表单的页面,而不是任何中间步骤。

    除了作为GET参数之外,还有其他方法可以将变量从一个请求传递到另一个请求吗?

3 个答案:

答案 0 :(得分:1)

我认为传递GET参数是一个很好的选择,原因如下:

  • 使用GET参数可以创建独立的API。假设用户上传了10个图片,并为参数设置了10个不同的值,假设为“imageName”。现在API可以是独立的,允许用户进行如下调用:
    1. .... getImage?imageName = 1
    2. ....的getImage?imageName = 2
    3. ....的getImage?imageName = 3

您可能会做的只是在请求完成后重写网址,以便使用 imageName 参数看起来网址不够丑。

我认为保持会话中的数据应该是最后的手段。会话中的数据使应用程序很难在运行时进行扩展。在关闭该服务器上的所有会话之前,无法关闭服务器以进行维护。基本上会话数据会带来很多麻烦。

答案 1 :(得分:1)

我建议的方法很难看,但它不会向用户显示查询字符串中的变量。

考虑如下修改 ImageUpload.php 文件(未经测试的代码):

$imageID = processImageUpload();

if($imageID){
    <?php
        <!Doctype html>
        <html>
            <head>
                <title>Upload successful! Redirecting...</title>
                <script type="text/javascript">
                    window.onload = function () {
                        document.getElementById("redirectionForm").submit();
                        return;
                    }
                </script>
            </head>
            <body>
                <div style="text-align: center; padding: 50px; font-style: italic;">
                    Image upload successful!
                    <br />
                    Please wait while you are redirected...
                </div>
                <form id="redirectionForm" action="ImageDisplay.php" method="post">
                    <input type="hidden" name="uploadedImageID" value="<?php echo $imageID; ?>" />
                </form>
            </body>
        </html>
    ?>
}

这将在客户端输出一个表单,然后将用户重定向到 ImageDisplay.php 以及相关的POST数据信息。

答案 2 :(得分:-1)

您可以设置自定义标题,如:

header('X-UploadedImageID: 123');

您可以headers_list()访问标题:

headers_list();

这个var_dump()看起来像是:

array(2) {
  [0] =>
  string(35) "X-Powered-By: PHP/5.3.19"
  [1] =>
  string(22) "X-UploadedImageID: 123"
}

因此,要获得123,您只需要执行以下操作:

$headers = headers_list();
echo str_replace('X-UploadedImageID: ', '', $headers[1]);

哪个会给你:123

确保在输出任何数据之前和调用标题位置重定向之前设置这些标题。

将您的ImageUpload.php更改为:

$imageID = processImageUpload();

if($imageID){
    header('X-UploadedImageID: ' . $imageID);
    redirect("/ImageDisplay.php");
}

将您的ImageDisplay.php更改为:

$headers = headers_list();
$uploadedImageID = str_replace('X-UploadedImageID: ', '', $headers[1]);

if($uploadedImageID != FALSE){
    //Display the image just uploaded with an 'image uploaded success!' message
}