避免使用浏览器后退按钮在Front Controller应用程序中提交表单

时间:2013-10-18 19:19:26

标签: php forms browser controller back

这是我的第一个PhP-MySQL项目和我的第一个(永远)问题。我试图建立一个小型门户网站,并且为了学习基础知识,我正在尝试使用前端控制器模式,因为我目前无法使用Observer模式。

前端控制器基本上看起来像下面这样,并调用正确类的适当方法:

$controller =''; $action =''; $queryString ='';
parseURL($controller, $action, $queryString);
$objView = new View;
if ($controller == 'adminlogin' && $action == 'authenticate') {
    AdminLogin::getInstance()->authenticate();
} else if ($controller && $action) {
    SessionFactory::getSession();
    if (isset($_SESSION['userName'])) { // and some more validations
        callHook($controller, $action, $queryString);
    } else {
        $objView->assign('message', SESSION_INVALID);
        $objView->display('index');
    } 
} else {
    $objView->display('index');
}

视图也很简单:

public function assign ($variable, $value)
{
    $this->passArray[$variable] = $value;
}

public function display ($view)
{
    $mapper = ViewmapSingleton::getinstance();
    if (1 == preg_match("/\/|\.|\\\\/", $view)) {
        echo 'View name should not contain . / or \ ';
    }
    $template = $mapper->getViewPath($view);
    if (!$template || is_dir($template)) {
        echo 'The requested view file does not exist';
    } else {
        extract ($this->passArray);
        include_once($template);
    }
}

我的问题是提交$ _POST表单时浏览器的BACK按钮。我正在尝试创建一个显示文章列表的管理页面,并允许分页,批量操作和“按标题/类别搜索文章”等。

根据我在这个(最有用的)网站上所读到的,有两种解决方案可以阻止浏览器的后退按钮重新提交表单:

解决方案1.将搜索参数传递给操作(方法),方法是使用“搜索”按钮上的Javascript将它们附加到URL。

<input id="btn1" type="submit" onclick="SubmitForm('index.php?   controller=articles&action=showList&articleTitle='+document.getElementById('articleTitle').value)" value="Search" name="btn1"></input>

=&GT;不是最好的方法,因为可能有许多参数,如文章类别等。

解决方案2.不要传递参数,而是在被调用的方法中使用$ _POST数据。将所有内容保存在$ _SESSION中,然后使用header()将其重定向到同一个类中的单独显示方法。从显示功能中的$ _SESSION中提取所有内容并生成视图。

=&gt;不是最好的方法,因为可能有许多参数必须存储在Session中然后提取。

使用前端控制器时,是否有更优雅的方法可以阻止浏览器的后退按钮重新提交表单?我问,因为在使用前端控制器模式时,$ _GET可能没什么用,特别是在某些批量操作需要更改数据库并且类型为“取消发布”时。

请忽略我的无知和帮助!

由于

2 个答案:

答案 0 :(得分:0)

您可以通过其他方式使用重定向。

更新:请参阅此解决方案。 Back button re-submit form data ($_POST)

答案 1 :(得分:0)

欢迎来到SO!

首先,除非GET是绝对必要的,否则总是使用POST进行表单提交。 (见下文详情)

您的PHP代码应该完全依赖$ _POST来检索提交的数据($ _GET可能是空的,$ _REQUEST结合$ _GET和$ _POST)。

在您的应用程序收到表单数据并可能已对其进行处理后,重定向浏览器。不要发送HTML响应,而是发送一个302 Moved将浏览器指向下一页:

一个非常基本的例子:

session_start();                                       // make sure a session is available
if (is_array($_POST) && array_key_exists('submitbutton_name', $_POST)) {
    // user has submitted the form
    $inputdata = $_POST;                               // retrieve input data
    $next_page_html = determine_next_page($inputdata); // process and construct next page
    $_SESSION['page_to_show'] = $next_page_html;       // keep the HTML response

    // redirect the browser to the very same location, but using GET
    header('Location: ' + $_SERVER['REQUEST_URI']);
    exit;
}

// the redirect will end up here
if (array_key_exists('page_to_show', $_SESSION)) {
    // we have a next page to show
    echo $_SESSION['next_page_to_show'];
    // don't forget to remove the session entry
    unset($_SESSION['next_page_to_show']);
}
else {
    // output the starting page, probably the form that the user should submit
}

HTH