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

[已解决] 新手关于验证码session的求助

[复制链接]
发表于 2016-12-25 23:52:12 | 显示全部楼层 |阅读模式
登录类型网页一个控制器一个html,放在本地验证码能正常使用,传送到服务器上后,验证码总是输入错误,验证后发现验证码的session显示为空,找了半天没找出原因,求老司机指导一下,万分感谢。
附上代码:Html页面(login.html):
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
        <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
        <title>用户登录</title>
        <link rel="stylesheet" href="<?php echo base_url('styles/login-register.css');?>" />
                <script type="text/javascript">
                function checkcode(){
                        var incode = document.getElementById('captcha').value;
                          if (incode.length == 0) {
                          document.getElementById('captcha_re').innerHTML= "验证码不能为空";
                      return false;
                  }
                          var incode = incode.toLowerCase();//转化大写为小写
                        if(incode){
                                var xhr=new XMLHttpRequest();
                                //创建AJAX对象                               
                                xhr.open('get','<?php echo site_url('login/checkCD');?>'+'/'+incode);
                                //发送请求
                                //send(get-null/post-给服务器传递的参数)
                                xhr.send(null);
                                xhr.onreadystatechange=function(){
                                        if(xhr.readyState==4){
                                                if(xhr.responseText=="1"){
                                                        document.getElementById('captcha_re').innerHTML="验证码正确";                                                       
                                                }else if(xhr.responseText=="2"){
                                                        document.getElementById('captcha_re').innerHTML="无SESSION";
                                                        return false;
                                                }else{
                                                        document.getElementById('captcha_re').innerHTML="验证码错误";
                                                        return false;
                                                }                                               
                                        }
                                        }
                                        }
                }
               
               
                </script>
</head>
<body>
        <div class="shop_hd_header">
        <div class="shop_hd_header_logo">
       
                <a href="<?php echo site_url('home/index');?>"><img src="<?php echo base_url('qimages/logo.jpg');?>" alt="" /></a>
        </div>
        </div>
       
        <div class="main">
                <div class="login-form-left">
                 <img src="<?php echo base_url('qimages/left.jpg');?>"/>
                </div>
                <div class="login-form" style='width:400px;'>
                        <div class="form-hd">
                                <h3>用户登录</h3>
                        </div>
                        <div class="form-bd">
        <form action="<?php echo site_url('login/signin');?>" method="post">
                                  <table style='width:400px;'>
      <tr>
        <td style='width:70px'>用户名:</td>
        <td style='width:180px'><input type="text" name="user_name"/></td>
        <td style='width:150px'></td>
      </tr>
      <tr>
        <td>密 码:</td>
        <td><input type="password" name="password" /></td>
      </tr>
      <tr>
              <td>验证码</td>
        <td><input type="text" id="captcha" name="captcha" class="capital"/></td>
        <td id="captcha_re"> </td>
      </tr>
      <tr>
      <td><span></span></td>
      <td>
      <img src="<?php echo site_url('login/code')?>" alt="" onclick= this.src="<?php echo site_url('login/code').'/' ?>"+Math.random() style="cursor: pointer;" title="看不清?点击更换另一个验证码。"></img>

      </td>
      </tr>
<tr><td><span></span></td><td><span>点击图片更换验证码</span></td></tr>

      <tr><td></td><td><input type="submit" value="登录" style="width:80px;height:40px;background:#F08300;color:white;"/>  <a href="<?php echo site_url('notice/index')."/2";?>"><span>忘记密码</span></a></td></tr>
      <tr>
       <td></td><td><span>还不是本站会员?</span><a href="<?php echo site_url('login/register');?>">立即注册</a></td>
      </tr>
      </table>
      </form>
                </div>
        </div>
        </div>       
</body>
</html>

php页面(login.php):

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

//前台首页控制器
class Login extends Home_Controller{

        public function __construct(){
                parent::__construct();
                $this->load->helper('my_aptcha_helper');
                $this->load->library('form_validation');
                $this->load->model('login_model');
        }
       
        public function index(){
            $this->load->view('login.html');
            $this->load->view('bottom2.html');
        }

        #生成验证码
        public function code(){
            #调用函数生成验证码
            $code = create_captcha();
            #将验证码字符串保存到session中
            $this->session->set_userdata('code',"1234");


        }
        public function checkCD($code){
           if($code==strtolower($this->session->userdata('code'))){
               echo "1";
           }else if($this->session->userdata('code')==""){
               echo "2";
           }else{echo "0";}
            #停止执行后续动作
            exit;
        }
       

}

 楼主| 发表于 2016-12-25 23:55:38 | 显示全部楼层
#将验证码字符串保存到session中,$this->session->set_userdata('code',"1234");这里本来"1234"是$code,为了测试改的。
 楼主| 发表于 2016-12-26 00:07:41 | 显示全部楼层
$this->load->helper('my_aptcha_helper');改自原来系统的$this->load->helper('captcha')文件。在本地能正常使用
发表于 2016-12-26 10:32:16 | 显示全部楼层
你的视图不能用 .html 吧,应该会无法执行里面的 PHP 代码。
 楼主| 发表于 2017-1-3 23:42:37 | 显示全部楼层
自己解决了,CI自带的session在此处不能正常工作,换成PHP的session网页验证码就正常使用了。至于为什么不能正常使用,我不确定,估计是因为本网页用了ajax,但CI的session必须跳转一次页面后才能使用。至于为什么在本地能用,我就不知道了。
 楼主| 发表于 2017-1-3 23:49:58 | 显示全部楼层
       #生成验证码
        public function code(){
            #调用函数生成验证码
            $code = create_captcha();
            #将验证码字符串保存到session中
            $this->session->set_userdata('code',"1234");
        }

将此段改成:
#生成验证码
        public function code(){
            $this->load->helper('MY_aptcha_helper');
            #调用函数生成验证码
            $code = create_captcha();
            #将验证码字符串保存到session中
        session_start();
        $_SESSION['code']=$code;
        }

需验证的时候:
public function checkCD($code){
            session_start();
           if($code==strtolower($_SESSION['code'])){
               echo "1";
           }else{echo "0";}
            #停止执行后续动作
            exit;
        }
发表于 2017-1-4 11:02:25 | 显示全部楼层
moving6 发表于 2017-1-3 23:42
自己解决了,CI自带的session在此处不能正常工作,换成PHP的session网页验证码就正常使用了。至于为什么不 ...

CI 3 的 Session 就是 PHP 原生 Session,也就是和 $_SESSION 是一样的。所以如果你是 CI 3 应该是其他原因引起的。另外 CI 3 的 Session 也是立即生效,不是下一个请求生效。

本版积分规则