yii2图片验证码
控制器LoginController.php
<?php
namespace backend\controllers;
use Yii;
use yii\debug\models\search\Log;
use yii\web\Controller;
use backend\models\Login;
use frontend\models\ContactForm;
use Illuminate\Http\Request;
use yii\web\Session;
use backend\controllers\CommonController; class LoginController extends Controller
{
public function actions(){
return [
'error' => [
'class' => 'yii\web\ErrorAction',
],
'captcha' => [
'class' => 'yii\captcha\CaptchaAction',
'maxLength'=>4,
'minLength'=>4,
],
];
}
public function actionIndex(){
//调用model
$model = new Login();
if ($model->load(Yii::$app->request->post()) && $model->validate()){
return $this->refresh();
}
//我的view里面是login,所以下面是login
return $this->render('login',[
'model'=>$model,
]);
}
}
model里面Login.php
<?php
namespace backend\models;
use Yii;
use yii\base\Model;
use yii\db\Query;
use common\models\User; class Login extends Model
{
public $verifyCode;
public $username;
public $password;
private $_user;
/**
* @return array the validation rules.
*/
public function rules()
{
return [
// [['username'], 'required','message'=>'用户名不能为空'],
[[ 'password'], 'required','message'=>'密码不能为空'],
// verifyCode needs to be entered correctly
['verifyCode', 'required','message'=>'验证码不能为空'],
['verifyCode', 'captcha','message'=>'验证码不正确'],
['username', 'unique', 'targetClass' => '\frontend\models\Login', 'message' => '用户名已存在.'],
];
}
/**
* @return array customized attribute labels
*/
public function attributeLabels()
{
return [
'rememberMe'=>'下次记住我',
'verifyCode' =>''
];
} /**
* @param $verifyCode
* @return bool
*/
public function validateVerifyCode($verifyCode){
if(strtolower($this->verifyCode) === strtolower($verifyCode)){
return true;
}else{
$this->addError('verifyCode','验证码错误.');
}
} /**
* @param $username
* @param $password
* @return int|string
* 验证用户名,密码返回C层
*/
public function code($username,$password){
$sql="select * from admin where admin_name='$username'";
$db =\Yii::$app->db->createCommand($sql)->queryOne();
if($db){
if($db['admin_pwd']==md5($password)){
return 0;
}else{
return "-1";
}
}else{
return "1";
}
}
} view里面login
<?php
use common\widgets;
use yii\helpers\Html;
use yii\bootstrap\ActiveForm;
use yii\captcha\Captcha;
use yii\helpers\Url;
use yii\widgets\LinkPager;
use yii\base;
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title></title>
<link rel="stylesheet" href="css/reset.css" />
<link rel="stylesheet" href="css/login.css" />
</head>
<body> <div class="page">
<div class="loginwarrp">
<div class="logo">管理员登陆</div>
<div class="login_form"> <?php $form=ActiveForm::begin([
'action'=>Url::toRoute(['show']),
'method'=>'post',
]); ?>
<th>姓名:</th><input type="text" name="username" style="width: 206px;height: 32px"><br><br>
<th>密码:</th><input type="password" name="password" style="width: 206px;height: 32px"><br><br>
<?= $form->field($model, 'verifyCode')->widget(Captcha::className(), [
'template' => '<div class="row"><div class="col-lg-4">{image}</div><div class="col-lg-6">{input}</div></div>',
]) ?> <div class="form-group">
<?= Html::submitButton('登录一下', ['class' => 'btn btn-primary']) ?>
</div> <?php ActiveForm::end(); ?>
</div>
</div>
</div>
</body>
</html>
在下面还需要改yii2里面原生代码,想知道这是为什么吗???因为原生代码是site/captcha,应该是两个php页面有
vendor/yiisoft/yii2/captcha/
Captcha.php
还有一个我给忘记了 就在这个文件里captcha
网上的大多数解决方法都是通过修改vendor/yiisoft/yii2/captcha/CaptchaAction.php
中的代码来解决,以下两种方法可以任选其一:
1.修改getVerifyCode()方法的参数默认值
将参数$regenerate的默认值由false改为true,这样在不传参数的情况下,程序每次获取验证码时都会重新生成。
2.修改run()方法
在红色箭头指向的地方中,添加一个参数true,同样可以解决问题。
带来的问题
使用上面两种方法确实都可以解决验证码不刷新的问题,但这样会带来一个新的问题,就是在开启表单客户端验证(enableClientValidation)的情况下,即使用户输入了正确的验证码,网页仍然会提示“验证码错误”:
那肿么办呢?在这里我们可以选择关闭表单的客户端验证功能,以此来解决这个问题:
但这种解决方法不是很完美,因为关闭了客户端的验证功能后,表单数据就只能提交到后台后再验证了,这样无疑会增加服务器的压力。
完美解决方法
上面说了那么多,解决方法貌似都不是很完美,其实要完美解决验证码不刷新的问题十分简单,我们不需要修改CaptchaAction.php
,只要修改vendor/yiisoft/yii2/captcha/CaptchaValidator.php
这个文件就可以了,修改的地方见下图
在红色箭头指向的地方,将参数false改为true即可完美解决问题。
总结
归根到底,是因为yii2在渲染Captcha小部件的时候,会先输出js验证代码,然后再渲染验证码图片,也就是说,验证码字符串必须在输出js代码前就要重新生成,而CaptchaAction.php
中的run()
方法是渲染验证码图片的时候调用的,CaptchaValidator.php
中的clientValidateAttribute()
是输出js代码的时候调用的,所以接下来的道理,相信大家都已经明白了。
yii2图片验证码的更多相关文章
- 字符型图片验证码识别完整过程及Python实现
字符型图片验证码识别完整过程及Python实现 1 摘要 验证码是目前互联网上非常常见也是非常重要的一个事物,充当着很多系统的 防火墙 功能,但是随时OCR技术的发展,验证码暴露出来的安全问题也越 ...
- android图片验证码--自绘控件
自绘控件的内容都是自己绘制出来的 大致流程如下: 1.定义一个类继承view 使用TypedArray初始化属性集合 在view的构造方法中 有一个AttributeSet的参数 很明显是用来保存控件 ...
- webform(十)——图片水印和图片验证码
两者都需要引入命名空间:using System.Drawing; 一.图片水印 前台Photoshuiyin.aspx代码: <div> <asp:FileUpload ID=&q ...
- Android-简单的图片验证码
Android-图片验证码生成1.为啥要验证码?图片验证码在网络中使用的是比较普遍的.一般都是用来防止恶意破解密码.刷票.论坛灌水.刷页等.2.怎样的验证码比较好?验证码的获取方式无非就两种,一种是后 ...
- 在mvc中实现图片验证码的刷新
首先,在项目模型(Model)层中建立一个生成图片验证码的类ValidationCodeHelper,代码如下: public class ValidationCodeHelper { //用户存取验 ...
- Webform 文件上传、 C#加图片水印 、 图片验证码
文件上传:要使用控件 - FileUpload 1.如何判断是否选中文件? FileUpload.FileName - 选中文件的文件名,如果长度不大于0,那么说明没选中任何文件 js - f.val ...
- php 图片验证码生成 前后台验证
自己从前一段时间做了个php小项目,关于生成图片验证码生成和后台的验证,把自己用到的东西总结一下,希望大家在用到相关问题的时候可以有一定的参考性. 首先,php验证码生成. 代码如下: 1.生成图像代 ...
- python 识别图片验证码报IOError
说一下困扰了我一周的问题:识别图片验证码 本来我按照安装步骤(http://www.cnblogs.com/yeayee/p/4955506.html?utm_source=tuicool&u ...
- Atitit 图片 验证码生成attilax总结
Atitit 图片 验证码生成attilax总结 1.1. 图片验证码总结1 1.2. 镂空文字 打散 干扰线 文字扭曲 粘连2 1.1. 图片验证码总结 因此,CAPTCHA在图片验证码这一应用点 ...
随机推荐
- 笔记本光驱位安装固态硬盘及window系统一些过程记录
自己的笔记本电脑是13年买的 联想G480 i3 32位 2g内存,配置有点低,呵呵.当初刚毕业问家里要钱买的,到现在后悔没有买好一点的笔记本. 用着用着感觉内存不够用,网上就买了根内存条,买之前 ...
- CentOS 7中将Tomcat设置为系统服务
tomcat 需要增加一个pid文件,在tomca/bin 目录下面,增加 setenv.sh 配置,catalina.sh启动的时候会调用,在该文件中添加如下内容 CATALINA_PID=&quo ...
- Oracle表锁住处理
select object_id,session_id,locked_mode from v$locked_object; select b.owner,b.object_name,l.session ...
- hdu 5901 Count primes 素数计数模板
转自:http://blog.csdn.net/chaiwenjun000/article/details/52589457 计从1到n的素数个数 两个模板 时间复杂度O(n^(3/4)) #incl ...
- ECOS-Ecstore证书生产失效问题排查
无法生成证书问题排查 无法生成证书问题排查 author :James,jimingsong@vip.qq.com since :2015-03-02 名称解释(官方) 常见错误 1. 名称解释(官方 ...
- Python 智能处理方向的工具
机器视觉类:OpenCV. 自然语言处理:NLTK, jieba(Python中文分词组件),HanLP, FudanNLP, NLPIR, http://tm.itc.ntnu.edu.tw/CNL ...
- java中float和double的区别
float表示单精度浮点数在机内占4个字节,用32位二进制描述. double表示双精度浮点数在机内占8个字节,用64位二进制描述.浮点数在机内用指数型式表示,分解为:数符,尾数,指数符,指数四部分. ...
- @Autowired与 @Resource
@Autowired, @Resource 1.注解类型: Autowired可用于构造器.属性.方法.注解 @Target({ElementType.CONSTRUCTOR, ElementType ...
- TheSixthWeekJavaText
加密文档 实验要求编写一个算法加密一串英文字串. 设计思想:对于一个字符串,我们可以用String.charAt()方法依次取出其中的字符元素,组成一个字符数组.由于字符可以转化为short类型变量进 ...
- 理解iaas paas saas三种云服务区别
其实搞懂这个问题也不难,我们可以把云计算理解成一栋大楼,而这栋楼又可以分为顶楼.中间.低层三大块.那么我们就可以把Iass(基础设施).Pass(平台).Sass(软件)理解成这栋楼的三部分.基础设施 ...