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

Kohana上验证码类的应用问题

[复制链接]
发表于 2008-10-29 09:34:40 | 显示全部楼层 |阅读模式
我想实现的功能:通过AJAX传递参数对验证码进行验证

操作过程:
1.页面通过以下代码实现验证码生成:
PHP复制代码
$captcha = new Captcha;
    $date = array(
      'captcha'=>$captcha->render()
    );
    $view = new View("reguser");
    $view->date = $date;
    $view->render(true);
 
复制代码

2.生成具有验证码页的页面后,通过AJAX进行GET参数传递,传递参数后的验证代码如下:
PHP复制代码
  function checkCode(){
    $this->uri = new URI;
    $result = $this->uri->segment('captcha');
    $captcha = new Captcha;
    $captcha->valid($result);
    if($captcha->valid_count()>0){
      echo "验证码通过";
      $captcha->reset_count();
    }else{
      echo "验证码不通过";
    }
  }
 
复制代码


现在问题来了,如果是第一次输入了正确的验证码,可以通过,反之,第一次输入错误,返回出错信息后,再次输入,就算你输入的是正确的,它也提示出错,是否每次建立一个 new Captcha就会重新生成一个新的验证码?因为我是通过AJAX进行验证的,所以页面上的验证码依然是第一次生成的,没变过。如果真是那样,有没有什么办法可以在保持第一次生成验证码不变的基础上进行多次验证呢?
 楼主| 发表于 2008-10-29 09:50:28 | 显示全部楼层
在线等哦,希望知道的能说一下,不胜感激。
发表于 2008-10-29 10:11:55 | 显示全部楼层
帮顶,我不是 Kohana 专家,呵呵。
 楼主| 发表于 2008-10-29 10:45:20 | 显示全部楼层
继续等待中。。。。。。
 楼主| 发表于 2008-10-31 11:40:11 | 显示全部楼层
解决方法如下:
因为每次生成一个 new Captcha 时都会自动生成一个新的验证码,所以,在第一次生成验证码后通过Ajax进行验证时,不要再用new Captcha重新生成,而是直接取第一次生成验证码时产生的Session值"captcha_response"进行验证,该值采用sha1进行了加密。
代码如下:
PHP复制代码
 
  //验证码检验
  function checkCode(){
    $this->uri = new URI;
    $result = sha1(strtoupper($this->uri->segment('captcha')));
    if($result === Session::instance()->get('captcha_response')){
      echo "验证通过";
    }else{
      echo "验证失败";
    }
  }
 
复制代码
发表于 2008-10-31 12:37:28 | 显示全部楼层
那什么时候生成新的验证码呢?
发表于 2008-11-1 16:27:22 | 显示全部楼层
PHP复制代码
 
//验证码检验
function checkCode(){
    $this->uri = new URI;
    $result = $this->uri->segment('captcha');
    $captcha = Captcha::instance();
    $captcha->valid($result);
    if($captcha->valid_count()>0){
      echo "验证码通过";
      $captcha->reset_count();
    }else{
      echo "验证码不通过";
    }
  }
 
复制代码

这个版本如果还是不能满足你的要求,你可以使用szlinz 的解决方案,自己取session值来验证。Hex问的生成新的验证码时间,可以使用request::is_ajax(),来判断是不是页面首次加载或F5刷新来生成:
PHP复制代码
 
if(request::is_ajax())
{
     //~取session值验证
}
else
{
     //~new Captcha();
}
 
复制代码
发表于 2008-11-1 16:36:05 | 显示全部楼层
doutu 解答的很清楚,非常感谢!

本版积分规则