当前位置: 首页 > 知识库问答 >
问题:

禁用codeigniter中的后退按钮?

巢靖
2023-03-14

我开发了一个简单的用户管理系统。在用户登录时,我设置了数据库会话。我也会在注销时销毁它们。我的缓存也被关闭。即使当我点击浏览器上的后退按钮时,我可以看到我的仪表板,当我点击任何链接时,它应该将我重定向到登录,但它首先显示仪表板,这是一个bug。

登录中的控制器。php:

<?php
  class Logins extends CI_controller{

    public function index(){
        $this->load->view('login');

    }

    public function getdata(){
        
     $name = $this->input->post('name');
     $pass =$this->input->post('pass');
     $this->db->where('name =', $name);
     $this->db->where('pass =',$pass);
    // $this->db->where('status =', 'registered');
     $query=$this->db->get('form');

     if($query->num_rows()== 1)
     {
        $newdata = array(
                   'name'  => $name
               );

$this->session->set_userdata($newdata);
        //echo $name;
        $this->load->view('match',$name);
     }else 
     {
    redirect('logins');
    // $this->load->view('login');
     }
    }

    public function userlogout(){
        $this->session->unset_userdata('name'); 
         redirect('logins'); 

     }
  } 
?>
    

在match.php中查看页面:

    <!DOCTYPE html>
    <html>
    <head>
    
        <title></title>
    </head>
    <body>
    
    <div>
    <?php
    
    $session_id = $this->session->userdata('name');
    
    echo "Hi  $session_id U Logged In";
    ?>
    </div>
    <div style="text-align:right;">
        <a href="<?php echo base_url()?>logins/userlogout">Logout</a>
    </div>
    
    </body>
    </html>

当我点击后退按钮时,它会再次显示登录页面。

共有3个答案

慕仲渊
2023-03-14

试试这个。

public function getdata()
{
    ini_set('session.cache_limiter','public');
    session_cache_limiter(false);
}
湛文乐
2023-03-14

控制器:-检查会话是否存在于构造函数中,其中仪表板视图加载

<?php


    function __construct()
    {
        parent::__construct();


        if(!$this->session->userdata('name')) 
        {
            redirect('logins');
        }

    }




?>
何灿
2023-03-14

“禁用codeigniter中的后退按钮?”-不可能通过CodeIgniter实现

为什么不可能?

CodeIgniter是一个服务器端脚本Web框架,它只对自己的环境负责,而不是像JavaScript一样对客户端负责。因此,CI(CodeIgniter)不会影响浏览器的活动。

现在,我假设你想阻止视图/内容显示为未授权的用户,当用户注销并尝试通过点击浏览器返回按钮查看仪表板或任何其他内容(仅为登录用户制作)。

基本上,这是一个非常直接的前言,浏览器保持自会话(活动)以更快地工作,比如,我们可以在提交表单并返回后,通过返回按钮在表单中看到旧的输入数据。因此,一旦用户填写登录表单并提交表单,他们将在登录/仪表板页面上重定向,一旦他们单击注销按钮,他们将销毁用户的会话数据。但是在这个故事中,浏览器缓存了内容和表单数据

那么,我们能做什么?

好的,我们可以在应用程序响应中使用缓存头告诉浏览器,'嘿!Mozilla/Chrome/Browser不缓存/存储此页面,它不可缓存

哦不!!现在什么:(?

缓存头将通过从浏览器历史记录中删除内容来防止内容显示。但是如果一个页面被任何类型的表单提交逗乐了,那么用户很可能会要求“确认表单提交”。如果他们只是再次提交表格或按F5按钮,表格将以相同的先前数据或表格输入再次提交。

好的,那么我们如何处理CodeIgniter中的确认表单提交...?

我们可以使用OTT(一次性令牌)、CSRF(跨站点请求伪造)保护或任何其他只打算一次性使用的方法。Like CI具有CSRF REGENATE选项,可每次创建一个新的CSRF托克。您可以在application/config中找到该选项。php在CSRF部分$config['CSRF\u regenerate']中,只需将此$config['CSRF\u regenerate']=TRUE

仍然可以提交表格...?

哦,是的!为什么?因为您将$config['csrf\u regenerate']=TRUE但是,$config['csrf\u expire']仍然有很长的时间使旧的csrf令牌过期。因此,如果您将$config['csrf\u expire']=60 则您将无法通过“浏览器后退”按钮重新提交缓存表单。因为旧的CSRF令牌已过期

他嘿!!看来问题解决了:)是的!

这里是全新的控制器登录。php代码:

<?php
// security first always....
(defined('BASEPATH') or exit('No direct script access allowed'));
/**
 * Class Controller
 *
 * Class Logins Controller to handle login & logout
 */
class Logins extends CI_controller
{
    /**
     * Class Constructor
     */
    public function __construct()
    {
        // execute parent class constructor
        parent::__construct();
        // load helpers
        $this->load->helper(array('form', 'url', 'security'));
        // load lib
        $this->load->library('form_validation');
        // prevent from Browser Cache
        $this->output->set_header('Last-Modified: ' . gmdate("D, d M Y H:i:s") . ' GMT');
        $this->output->set_header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0');
        $this->output->set_header('Pragma: no-cache');
        $this->output->set_header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
    }
    /**
     * Default method to execute if method name missing
     * @return [type] [description]
     */
    public function index()
    {
        // check if user login or not
        if (!$this->session->userdata('name')) {
            // show login view
            $this->load->view('match');
        }
        // if already logged in, show other view
        else {
            // get name from session login flag
            $name = $this->session->userdata('name');
            // load view
            $this->load->view('match', $name);
        }
    }
    /**
     * login Form POST Method to verify Users identity
     * @return [type] [description]
     */
    public function getdata()
    {
        // if POST made then only
        if ($this->input->post()) {
            $rules = array(
                array(
                    'field' => 'name',
                    'label' => 'Name',
                    'rules' => 'trim|required|xss_cleaned|min_length[3]|max_length[25]',
                ),
                array(
                    'field' => 'pass',
                    'label' => 'Secret Password',
                    'rules' => 'required',
                ),
            );
            // form validation
            $this->form_validation->set_rules($rules);
            // check validation
            if ($this->form_validation->run() === false) {
                $this->load->view('match');
            } else {
                // safe from CSRF, use 2nd param as TRUE in POST
                $name = $this->input->post('name', true);
                $pass = $this->input->post('pass', true);
                // Query Where Conditioning
                $array = array('name' => $name, 'pass' => $pass, 'status' => 'registered');
                // produces: WHERE name = 'user-name' AND pass = '***' AND status = 'registered'
                $this->db->where($array);
                // get from MySQL Table
                $query = $this->db->get('form');
                // if result
                if ($query->num_rows() > 0) {
                    $sess_login = array(
                        'name' => $name,
                    );
                    // set session login flag
                    $this->session->set_userdata($sess_login);
                    // load view
                    $this->load->view('match', $name);
                } else {
                    redirect('logins');
                }
            }
        } else {
            redirect('logins');
        }
    }
    /**
     * Log Out Method
     * @return [type] [description]
     */
    public function userlogout()
    {
        $this->session->unset_userdata('name');
        redirect('logins');
    }
}

这里是全新的视图匹配。php代码:

<?php
$name = $this->session->userdata('name');
?>
<!DOCTYPE html>
<html>
<head>
    <title>CodeIgniter First Login</title>
    <link rel="stylesheet" type="text/css" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
    <script type="text/javascript" src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
<body>
    <div class="jumbotron vertical-center">
        <?php if ($name !== false): ?>
            <div class="container">
                <div class="alert alert-success">Wohoo!! You made it.. <?php echo $name ?> <a href="<?php echo base_url()?>logins/userlogout" class="btn btn-danger">Log Out</a></div>
            </div>
        <?php else: ?>
            <div class="container">
                <?php echo (validation_errors()) ? '<div class="alert alert-danger">'.validation_errors().'</div>' : ''; ?>
                <?=form_open('logins/getdata', 'class="form-controller"'); ?>
                <fieldset>
                    <legend>Login Information</legend>
                    <div class="form-group">
                        <label for="name">Name</label>
                        <input type="text" class="form-control" name="name" id="name" placeholder="Please enter your user name here" value="<?php echo set_value('name'); ?>">
                    </div>
                    <div class="form-group">
                        <label for="password">Secret Password</label>
                        <input type="password" class="form-control" id="password" name="pass" placeholder="Please enter your password here" value="<?php echo set_value('pass'); ?>">
                    </div>
                </fieldset>
                <div class="form-group row">
                  <div class="offset-sm-2 col-sm-10">
                    <button type="submit" class="btn btn-primary">Sign in</button>
                </div>
            </div>
            <?=form_close();?>
        </form>
    </div>
<?php endif ?>
</div>
</body>
</html>

配置。php

$config['csrf_protection'] = TRUE;
$config['csrf_token_name'] = 'csrf_test_name';
$config['csrf_cookie_name'] = 'csrf_cookie_name';
$config['csrf_expire'] = 120; // 2 minutes
$config['csrf_regenerate'] = TRUE;

 类似资料:
  • 问题内容: 如何禁用浏览器的“后退”按钮(跨浏览器)? 问题答案: 这个问题是非常相似,这一个 … 您需要强制缓存过期才能正常工作。将以下代码放在页面代码后面。

  • 问题内容: 我正在使用react native导航(react- navigation)StackNavigator。它从应用程序整个生命周期的“登录”页面开始。我不想使用返回选项,返回“登录”屏幕。有谁知道登录屏幕后如何将其隐藏在屏幕上?顺便说一句,我也使用以下命令将其隐藏在登录屏幕中: 问题答案: 1)要使后退按钮在react-navigation v2或更高版本中消失: 2)如果您要清理导航

  • 问题内容: 我想在片段类中禁用后退按钮。在此片段中似乎不起作用。如何禁用后退按钮? 这是我的示例代码: 问题答案: 您必须重写父FragmentActivity类的onBackPressed。因此,将您的代码放在父FragmentActivity中。或者,您可以使用以下方法调用父方法: 在FragmentActivity中重写onBackPressed方法,而不调用其超类来禁用后退按钮。

  • 大家好,我正在使用CodeIgniter框架,我有一个问题,在注销后,会话已经被销毁,并重定向到登录表单,并在重定向到登录表单后,浏览器返回按钮可以备份到仪表板,但有错误,因为会话是已经被摧毁了。所有我想要的是禁用浏览器的后退按钮或任何我以前不能加载的东西。我读过关于这个问题的其他帖子,并尝试了他们的解决方案,但它不起作用。我已经根据我在构造函数的其他帖子中读到的内容粘贴了这段代码。 这是我的注销

  • 问题内容: 我正在尝试在Cordova应用程序上禁用后退按钮。我正在使用AngularJS + Ionic Framework。我找到了有关此主题,并尝试了下面的代码,但它绝对没有效果。任何想法? index.html 请注意,当我按下后退按钮时,控制台中会显示“ hello”。 问题答案: 终于找到了这个 Ionic论坛主题的答案: 允许完全覆盖后退按钮行为。第一个参数是回调函数,第二个参数是优

  • 问题内容: 想要禁用网站的后退按钮 只要该人单击浏览器的“后退”按钮,它就不能进入他之前访问的页面。 问题答案: 该脚本将覆盖尝试以当前页面的状态来回导航。 更新: 一些用户报告说,使用document.URL而不是可以取得更好的成功document.title: