2010-05-25 98 views
2

我不确定填充通知页面的最佳方式是什么。我一直在使用会话来填充信息,但如果用户阻止了cookie,这会失败。我曾考虑过将它传递给HTTP GET变量,但我不确定它是否是一个好的选择,因为它的长度受到某些浏览器的限制。将数据传递给通知页面

你更喜欢哪种方法?

+0

要非常小心您允许传递的数据类型(例如,在页面上显示的文本字符串),因为它可以让您对xss攻击广泛开放 - 例如,如果有人更改url,以便它传递'' – oedo 2010-05-25 08:54:57

回答

1

您可以尝试使用错误消息的索引列表,然后将错误ID作为GET参数传递给页面。你不能真正使用POST,因为我想你会重定向到错误页面,因此GET请求几乎是你最好的选择。

这样做的另一种方式是让原始错误页面 - 即用户停留在同一个URL上,但获取修改后的HTTP状态代码(例如,404代表“未找到”,500代表发生服务器错误等)以及错误消息。通过这种方式,您不必担心通过HTTP请求填充页面,您可以在遇到错误的页面中简单地执行此操作。

我更喜欢第二种方法,即使它很难实现。有了它,您就可以使用错误和异常处理程序自动捕获任何错误情况,然后解除错误输出代码。

0

有一些通知属于生成它们的页面,例如表单域中的错误。这些很容易处理。我通常创建一个数组来保存它们以HTML格式,并使用一个函数来显示他们为HTML列表:

<?php 

$errors = array(); 

function print_errors($errors){ 
    if(!empty($errors)){ 
     echo '<ul><li>' . implode('</li><li>', $errors) . '</ul>'; 
    } 
} 

# ... 

if($foo<=0){ 
    $errors[] = '<label for="foo">Foo</label> is <strong>' . htmlspecialchars($foo) . '</strong> but it must be greater than zero.'; 
} 

if(empty($errors)){ 
    save_stuff(); 
    header('Location: http://example.com/somewhere/else/'); 
    exit; 
} 

# ... 

print_errors($errors); 

echo '<form action="" method="post">'; 
echo '<input type="text" name="foo" value="' . htmlspecialchars($foo) . '" id="foo">'; 
echo '</form>'; 

# ... 

?> 

再有就是你描述的情况:一个成功的(或不可能的)动作之后,用户将被重定向在其他地方(例如,主要部分页面)他得到解释。对于短消息,我倾向于使用纯文本格式保存消息的GET变量:

<?php 

if(isset($_GET['error'])){ 
    echo '<p class="error">' . htmlspecialchars($_GET['error']) . '</p>'; 
} 
if(isset($_GET['message'])){ 
    echo '<p class="message">' . htmlspecialchars($_GET['message']) . '</p>'; 
} 

?> 

这是企业内部网相当精细,但它有两个缺点:

如果你有一些可用存储(文件,数据库,等等)可以保持完整的HTML邮件,并为它们分配一个随机ID:

ID: 4a0a19218e082a343a1b17e5333409af9d98f0f5 
Date: 2010-05-25 11:24:30 
Type: message 
HTML: <a href="/item/25">Item #25</a> was modified successfully. 

http://example.com/?msg=4a0a19218e082a343a1b17e5333409af9d98f0f5 

确保您保存日期,以便您现在可以清理旧数据。

我的两分钱。

0

也有可能将PHP会话ID附加到页面上的每个链接,所以如果cookie失败,您可以回头看看。

如果这是不可能的,我也会保存消息到数据库并传递唯一的ID与$ _GET。