用户
 找回密码
 入住 CI 中国社区
搜索
查看: 2685|回复: 1
收起左侧

[HELP] session失效

[复制链接]
发表于 2013-5-29 19:57:12 | 显示全部楼层 |阅读模式
本人刚接触ci,试着动手写个登陆验证功能,但一直不成功,以下是代码,望高手指教!!!

captcha.php
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[2]|max_length[10]|required');  
         $this->form_validation->set_rules('password', 'Password', 'min_length[4]|max_length[10]|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[0]->upass==$_POST["password"])
                {  
                  if($_POST["rand"]==$this->session->userdata('v_word'))
                  {
                             
                           $arr=array("uid"=>$user[0]->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复制代码
 <?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>
复制代码




发表于 2013-5-30 20:10:28 | 显示全部楼层
我写的后台验证没有用到ci的form,刚开始也是用到ci的session 但是用段时间之后发现了问题,,就是用ajax提交分页的时候 老是提示我失效(cookie过期) 后来就选择了用原生的session来弄,cookie也是用原生的setcookie函数来弄的
附上我的代码 希望对你有帮助。。
PHP复制代码
 
    //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复制代码
 
<?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);
                                }
                        }
                }
               
       
        }
       
       
}
 
复制代码

本版积分规则