最佳实践将数据发布到具有相同URL的codeigniter控制器上?

时间:2018-10-15 12:35:16

标签: php codeigniter codeigniter-3

你好,我在codeigniter中有两条路线:

$route['register'] = 'Login/Register';
$route['login'] = 'Login/index';

用于显示登录/注册表格

并形成张贴路线:

$route['loginprocess'] = 'Login/LoginProcess';
$route['registerprocess'] = 'Login/RegisterProcess';

可以,但是在

中使用 form_validation类

$this->form_validation->set_error_delimiters('<span class="help-block">', '</span>');
        $this->form_validation->set_rules('email', 'Email', 'required|valid_email');
        $this->form_validation->set_rules('pwd', 'Password', 'required');

        if ($this->form_validation->run() == FALSE){
            $this->load->view('login');
        } else {
        validation success
     }

问题是当我在表单验证中收到错误时进入

http://localhost/logincode/loginprocess

是这样的,所以它不是URL友好的。它应该以已经显示表单的相同控制器方法发布:

http://localhost/logincode/login

所以有什么方法可以在相同的URL中发布表单。出现表单验证错误

1 个答案:

答案 0 :(得分:1)

在CodeIgniter中发布到相同的网址

您已经描述了一种常见情况。您要使用表单加载页面,执行POST请求,验证请求,然后在出现问题时显示错误。如果执行此操作,则需要注意一些潜在问题:

  1. 发布成功后,如果浏览器执行页面刷新会怎样?
  2. 发布成功后,如果用户导航到另一个页面却又往回浏览历史,会发生什么?

这两个问题均呈现重复的发布问题,这是绝对不希望的。解决此问题的方法是使用表单令牌。在加载存在表单的页面期间会生成一个表单令牌。该值通常是一个随机的字符串,放在两个位置:

  1. 在表单中为隐藏的表单字段。
  2. 在会话或cookie中。

发布表单时,隐藏表单字段中的令牌值将与其余发布的数据一起传递。由于存在包含相同值的会话或cookie,因此要发布的控制器/方法可以检查它们是否匹配,如果匹配,则可以执行验证,并输出错误或成功消息。无论如何,都会生成一个新的表单令牌,因此两个帖子永远不会包含相同的表单令牌。

基本概念摘要

// You of course have to start the 
// session for this to work.
$this->load->library('session');

if( 
    isset( $_POST['token'] ) && 
    isset( $_SESSION['token'] ) && 
    $_POST['token'] == $_SESSION['token'] 
){
    // Do validation ...
    // ...

    // If validation passes
    if( $this->form_validation->run() ){
        $valid = TRUE;
    }

    // If there were validation errors
    else{
        $errors = validation_errors();
    }
}

if( isset( $errors ) )
{
    // Display the errors
}

if( isset( $valid ) )
{
    // Display a thank you message
}

// Always refresh the token
$token = substr(md5(uniqid() . microtime() . rand()), 0, 8);
$_SESSION['token'] = $token;

?>

<form method="POST">
    <input type="text" name="x" />
    <input type="hidden" name="token" value="<?php echo $token; ?>" />
    <input type="submit" value="submit" />
</form>

在实践中,令牌的概念可能更加复杂。例如,您可以选择加密令牌值,然后在检查它们是否匹配时解密它们。您可能还会在会话/ cookie中创建令牌数组,并对照令牌数组检查发布的令牌。您可能还对如何自定义表单令牌有其他想法,但是这里已经介绍了基础知识,希望它可以帮助您实现在CodeIgniter中发布到相同URL的目标。