1

CodeIgniterでフォームページの更新を防ぐには?

リダイレクトを使用する場合 - すべて問題ありませんが、ページ site.com/update/success に直接アピールできます。成功ページ (site.com/update/ からのみ) への直接アクセスを防ぐにはどうすればよいですか?

コントローラー update.php

public function index() {
   if($this->form_validation->run() == FALSE) {
      $data['error'] = 'Something wrong';
      $this->load->view('update', $data);
   } else {
      redirect('/update/success');
   }
}

public function success() {
   $message = 'Your profile has been successfully updated';
   $this->load->view($message);
}
4

3 に答える 3

4

index() 関数で flashdata にトークンを設定し、success() メソッドでそのトークンを確認できます。

class Update extends CI_Controller {

    property $token;

    public function __construct()
    {
        $this->load->library('session');
    }

    public function index() {
       if($this->form_validation->run() == FALSE) {
          $data['error'] = 'Something wrong';
          $this->load->view('update', $data);
       } else {
          $this->session->set_flashdata('update_token', time());
          redirect('/update/success');
       }
    }

    public function success() {

        // Make sure this request came from the index() method...
        if( ! $this->session->flashdata('update_token'))
        {
            redirect();
        }

       $message = 'Your profile has been successfully updated';
       $this->load->view($message);
    }
}
于 2013-01-31T00:37:59.533 に答える
0
public function index() {
   if($this->form_validation->run() == FALSE) {
      $data['error'] = 'Something wrong';
      $this->load->view('update', $data);
   } else {
      // create success session/cookie
      $this->_success()
   }
}

public function _success() {
   // destroy success session when called
    // checks success session if existing if not the page has been refreshed redirect
   $message = 'Your profile has been successfully updated';
   echo $this->nocache();
   $this->load->view($message);
}

public function _nocache()
{
 header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
 header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); 
 header("Cache-Control: no-store, no-cache, must-revalidate"); 
 header("Cache-Control: post-check=0, pre-check=0", false);
 header("Pragma: no-cache");
}

URL からアクセスできないように「_」アンダースコアを追加し、ヘッダーに no cache を追加して、ページがブラウザにキャッシュされたままにならないようにすることができます。

テストされていないコード

于 2013-01-31T00:06:23.047 に答える
0

codeigniter を使用したのは少し前なので、よくわかりません。

おそらく、成功関数をプライベートにして、次のようにelseで呼び出すことができます:

    public function index() {
        if($this->form_validation->run() == FALSE) {
            $data['error'] = 'Something wrong';
            $this->load->view('update', $data);
        } else {
            $this->success();
        }
   }



    private function success() {
       $message = 'Your profile has been successfully updated';
       $this->load->view($message);
    }
于 2013-01-30T23:59:48.003 に答える