小网蚁 发表于 2013-5-29 19:57:12

session失效

本人刚接触ci,试着动手写个登陆验证功能,但一直不成功,以下是代码,望高手指教!!!

captcha.php
<?php if( ! defined('BASEPATH')) exit('No direct script access allowed');
class Captcha extends CI_Controller {

   public function index()
    {
      $out_datas=$this->_captcha();
      $this->load->view('login',$out_datas);
    }
    private function _captcha(){
      $this->load->helper("mycaptcha");//加载验证码
      $vals = array(
            'img_path'   => './captcha/',      //验证码图片存放的地址
            'img_url'=> base_url()."captcha/",//图片访问的路径
            'img_width'    => '60',                //图片的宽度
            'img_height' => '20',                  //高度
            'expiration' => 1,                     //存放时间,1分钟
            'word_length'=> 4                      //显示几位验证数字
      );

      $cap = create_captcha($vals);
      $out_datas["v_img"]=$cap["image"];                //生成的图片文件
      $out_datas["v_word"]=$cap["word"];
      $arr=array("v_word"=>$cap["word"]);
          $this->session->set_userdata($arr);         //生成的验证码,也可放入session中管理
      return $out_datas;
    }
function checklogin()
    {
           
   $this->load->model("test_m");
   if($_POST["submit"])
   {
          $this->load->library('form_validation'); // 使用CI的表单验证, 如下:
          $this->form_validation->set_rules('user', 'User', 'min_length|max_length|required');
         $this->form_validation->set_rules('password', 'Password', 'min_length|max_length|required');
         $this->form_validation->set_rules('rand', '验证码', 'required');
          if($this->form_validation->run() !== false)
          {   
         $user=$this->test_m->user_select($_POST["user"]);
             if($user)
             {
                     if($user->upass==$_POST["password"])
                     {
                       if($_POST["rand"]==$this->session->userdata('v_word'))
                       {
                                    
                                $arr=array("uid"=>$user->uid);
                                $this->session->set_userdata($arr);
                                echo"登陆成功!";
                                 $this->load->view('loginsuccess');      
                       }
                       else
                       {
                               echo "验证码有误!";
                               $data=$this->_captcha();
                    $this->load->view('login',$data);
                       
                       }
                       
                     }
                     else
                     {
                             echo"密码错误!";
                             $data=$this->_captcha();
                    $this->load->view('login',$data);
                     }
             }
             else
             {
                     echo "用户不存在!";
                     $data=$this->_captcha();
                $this->load->view('login',$data);
             }
          }
          else
          {
                 $data=$this->_captcha();
             $this->load->view('login.php',$data);
             
          }
   }
   else
   {
           echo"没有登陆!";
           $data=$this->_captcha();
             $this->load->view('login.php',$data);
   }
   }

   function checksession()
    {
   $this->load->library("session");
   if($this->session->userdata('uid'))
       echo "已登录!";
   else
       echo "没有登陆!";
    }
   function loginout()
    {
   $this->load->library("session");
   $this->session->unset_userdata('uid');
    }
};

#在 'img_path'   => './captcha/',我们将生成的图片存放在 项目/captcha目录下,所以我们要在application的同级目录中创建captcha目录,用来存放验证码图片applicationcaptcha --在application 的同级目录创建文件system

/* End of file welcome.php */
/* Location: ./application/controllers/welcome.php */
login.php
<?php echo form_open('captcha/checklogin');?>            <p>
                <?php   
                  echo form_label('User: ', 'user');
                  echo form_input('user','', 'id="text"');
                ?>
            </p>
            <p>
                <?php   
                  echo form_label('Password: ', 'password');
                  echo form_input('password', '', 'id="password"');
                ?>
            </p>
         <p>
               <?php
                   echo form_label('验证码: ', 'rand');
                   echo form_input('rand','', 'id="text"');
                   echo $v_img;

               ?>
          </p>
            <p>
                <?php echo form_submit('submit','Login');?>
            </p>
            <?php echo form_close();?>

            <div class="errors"><?php echo validation_errors();?></div>



57sy.com(隐身中 发表于 2013-5-30 20:10:28

我写的后台验证没有用到ci的form,刚开始也是用到ci的session 但是用段时间之后发现了问题,,就是用ajax提交分页的时候 老是提示我失效(cookie过期) 后来就选择了用原生的session来弄,cookie也是用原生的setcookie函数来弄的
附上我的代码 希望对你有帮助。。

    //function 处理登录页面
    function do_login(){
           
            $post_data = $this->input->post(NULL,true) ;
            $username =$this->admin_common->do_addslashes($post_data['username']);
            $passwd = $this->admin_common->do_addslashes($post_data['passwd']);
               
            if(empty($username)){
                    showmessage('用户名错误请正确输入','admin/login/show_login',3,0) ;
            }elseif(empty($passwd)){
                    showmessage('请输入正确的密码,密码不可以为空','admin/login/show_login',3,0) ;
            }
            if(!$this->config->item('is_need_passwd') && $username == $this->config->item('web_admin_master')){
                    //后台密码忘记
                            @ob_clean() ;
                          @session_start() ;
                          $_SESSION['username'] = $this->config->item('web_admin_master');
                          $_SESSION['client_ip'] = $this->admin_common->get_client_ip() ;
                         
                                header("Location:".site_url('admin/index/frame'));
            }else{
                  $passwd =md5($post_data['passwd']);
                  $sql ="SELECT * FROM common_member where username='{$username}' and passwd='{$passwd}' AND allowadmin='1' AND status = '1'";
                  $result = $this->M_login->query_one($sql);
                  if(empty($result)){
                          showmessage('用户名或者密码错误,或者你没有后台的权限进行登录,请仔细的检查','admin/login/show_login',3,0) ;
                  }else{
                          //把当前用户的权限查询出来
                          $sql_user = "SELECT `groupid` FROM `common_member`WHERE username='{$result['username']}'" ;//查询group id
                          $one_res = $this->M_members->query_one($sql_user);
                          $duty_id = intval($one_res['groupid']);
                          //查询group name
                          $sql_group_name = "SELECT `duty_name` FROM `common_duty` WHERE `duty_id` = '{$duty_id}'" ;
                          $one_res_group = $this->M_team->query_one($sql_group_name);
                                if(isset($one_res_group['duty_name']) && $one_res_group['duty_name'] != ""){
                                        $group_name = $one_res_group['duty_name'];
                                }
                                $group_name = '' ;
                                $sql_user_permition = "SELECT `duty_perm` FROM `common_duty_perm` WHERE `duty_id` = '{$duty_id}'" ;
                          $one_res_perm = $this->M_duty_perm->querylist($sql_user_permition);
                          if($one_res_perm){
                                  $one_res_perm =$this->admin_common->arrayChange($this->admin_common->object_to_array($one_res_perm)); //用户特有的权限
                          }
                          $one_res_perm = serialize($one_res_perm);
                          setcookie($this->config->item('cookie_prefix').'permition',$one_res_perm,time()+$this->config->item('cookie_expire'),$this->config->item('cookie_path'),$this->config->item('cookie_domain'),$this->config->item('cookie_secure')) ;
                          @ob_clean() ;
                          @session_start() ;
                          $_SESSION['username'] = $result['username'];
                          $_SESSION['client_ip'] = $this->admin_common->get_client_ip() ;
                          $_SESSION['group_name'] = $group_name ;
                                @header("Location:".site_url('admin/index/frame'));
                  }
            }
   

       }



后台验证是否登录成功 用的ci钩子

<?php
if (! defined('BASEPATH')) {
        exit('Access Denied');
}
/*
*check admin is login
*author wangjian
@验证用户是否登录了
*/
class check_authority{
        private $CI;
        public function __construct() {
                $this->CI = &get_instance(); //初始化 为了用方法
               
        }
        function auth(){
                $this->CI->load->library('admin_common');//加载admin的公用方法
               $username =$this->CI->admin_common->login_name();
                if(preg_match("/admin(.*)/iUs", uri_string())){
                        //如果url地址里面包含了admin
                        if(!preg_match("/admin\/login\/(.*)/iUs", uri_string())){
                               
                                if(empty($username) || $username == ""){
                                        showmessage("密码已经过期",'admin/login/show_login',3,0);
                                }
                        }
                }
               
       
        }
       
       
}
页: [1]
查看完整版本: session失效