码农网技术教程资源分享平台:PHP、前端、Go、Python等视频教程大全

码农网是一个技术教程资源分享平台。它收集了多种类型的视频教程,包括 php 视频教程、前端各种视频教程、接口 API、微信公众号视频教程、支付宝视频教程,还有 go 语言、python 等视频教程。这些教程以链接加提取码的方式分享给大家。
每天通过公众号来阅读文章并进行学习,目前是最为便捷的方式。在闲暇时间里,利用 5 分钟读读技术文章,能够丰富自身知识。当然,学习存在多种方法,并非仅仅依靠公众号来学习,你可以到网上去查找更多的教程、学习文档、技术书本以及视频教程!每个人都有自己的爱好。
视频教程推荐
ThinkPHP5.0正式版第二季:实战开发企业站
金币充值规则与优惠
文章正文
现在许多网站,像淘宝、京东等,都开始采用极验拖动验证码来实现登录。这种方式相较于传统验证码方式,能带来更好的体验,能够减少用户输入的错误,并且也能起到防盗刷的作用。如今,很多极验是第三方的,并且很多都是收费的。在此主要为大家介绍 thinkphp 整合系列中的极验滑动验证码 geetest,其官网为:
具体如下:
一:注册获取key
注册;创建应用;获取key;
二:导入sdk
ThinkPHP 库中的 Org 目录下的 Xb 目录中有一个名为 GeetestLip.class.php 的文件(此 GeetestLip.class.php 是我重新命名的 geetest 类文件,原本名为 class.geetestlib.php)
这里涉及到 thinkphp 引入第三方类的情况,我将第三方类放置到 Org/Util/Xb 之下了,并且给该类文件添加了命名空间,不然在实例化类的时候找不到文件。
三:生成验证样式
在 admin 目录下的 view 文件夹中,有一个名为 public 的文件,其中包含 cdtsh_log_smfyws.php 这个文件。
<html>
<head>
<meta charset="GBK" />
<title>网站管理系统后台title>
<script language="javascript" type="text/javascript" src="__JS__/jquery.js">script>
<link rel="stylesheet" href="CSS 样式表文件 /jquery.validator.css">
<script type="text/javascript" src="__JS__/jquery.validator.js">script>
<script type="text/javascript" src="__JS__/zh_CN.js">script>
<link href=“CSS 位于/admin_login.css?v20130227 处” rel="stylesheet" />
<script>
$(document).ready(function(){
var verifyimg = $(".verifyimg").attr("src");
$(".reloadverify").click(function(){
if( verifyimg.indexOf('?')>0){
$(".verifyimg").attr("src", verifyimg+'&random='+Math.random());
}else{
$(".verifyimg").attr("src", verifyimg.replace(/\?.*$/,'')+'?'+Math.random());
}
});
});
script>
head>
<body>
<div class="wrap">
<h1><a href="javascript:;" style=高度为 116 像素,宽度为 250 像素。>后台管理中心a>h1>
<form method="post" action=Admin/Public/cdtsh_log_smfyws 这个内容被使用或提及了。>
<div class="login">
<ul>
<li>
<input class="input" id="username" name="username"type="text" title="用户名" data-rule="required;username" placeholder="用户名" />
<span class="msg-box n-right" style=位置是绝对的;左边的位置是 248 像素;上边的位置是 12 像素。 for="username">span>
li>
<li>
<input class="input" name="password" type="password" title="密码" data-rule="required;password" placeholder="密码"/>
<span class="msg-box n-right" style=它的顶部是 12 像素。 for="password">span>
li>
<li>
<input class="input" id="verify" name="verify" type="text" style="width:130px;" title="密码" data-ok=" " placeholder="验证码" data-tip="输入验证码!" title="验证码" data-rule=需要;文本;远程[{$U('Admin/Public/check_verify')}] />
<div class="yanzhengma_box" id="verifyshow"> <img class="verifyimg reloadverify" style=" cursor: pointer;" align="right" src="{:U('public/verify')}" title="点击刷新"> div>
<span class="msg-box n-right" style="position:absolute;left: 248px; top: 12px;" for="verify">span>
li>
ul>
<ul>
<div id="captcha">div>
ul>
<button type="submit" class="btn" id="subbtn">登录button>
div>
form>
div>
<script src=“http://static.geetest.com/static/tools/gt.js”这个地址是用于特定工具的文件路径。它指向一个名为“gt.js”的文件,该文件位于“static.geetest.com”的“static/tools”目录下。此文件在相关系统或应用中可能具有特定的功能和作用。>script>
<script>
var handler = function (captchaObj) {
// 将验证码加到id为captcha的元素里
captchaObj.appendTo("#captcha");
};
// 获取验证码
$.get(Admin 下的 Public 目录中的 verifys 文件路径为 "{:U('Admin/Public/verifys')}" 。, function(data) {
// 使用initGeetest接口
参数 1 为配置参数,并且该参数与创建 Geetest 实例时所接受的参数是一致的。
参数 2 为回调,回调的第一个参数是验证码对象,之后能够利用它来进行 appendTo 之类的事件操作。
initGeetest({
gt: data.gt,
challenge: data.challenge,
product: "float", // 产品形式
offline: !data.success,
new_captcha:'true',
width:'260px',
}, handler);
},'json');
script>
body>
html>
四:验证函数
在 /Application/Common/Common 目录下有一个名为 function.php 的文件。
/**
* geetest检测验证码
*/
function geetest_chcek_verify($data){
$geetest_id = "7149e2021d7938157e";
$geetest_key = "62b92039e1e9cf9455";
$geetest=new使用 \Org\Util\Xb\GeetestLib 这个类,并传入 geetest_id 和 geetest_key 作为参数。
$user_id=$_SESSION['geetest']['user_id'];
$ip_address=$_SESSION['geetest']['ip_address'];
$dataa = array(
"user_id" => $user_id, # 网站用户id
"client_type" => "web", 电脑上的浏览器称为 web;手机上的浏览器包括移动应用内完全内置的 web_view 以及通过原生 SDK 植入 APP 应用的方式称为 native
"ip_address" => $ip_address, # 请在此处传输用户请求验证时所携带的IP
);
if ($_SESSION['geetest']['gtserver']==1){
$geetest->success_validate 函数作用于 $data 中的内容,其结果存储在 $result 中。'geetest_challenge'], $data['geetest_validate'], $data['geetest_seccode'], $dataa);
//return $result;
if ($result) {
//return 11;
return true;
} else{
//return 22;
return false;
}
}else{
ifgeetest 对数据进行了失败验证,即对 $data 进行了 fail_validate 操作。'geetest_challenge'],$data['geetest_validate'],$data['geetest_seccode'])) {
//return 33;
return true;
}else{
//return 44;
return false;
}
}
}
//获取id地址
function GetIP() {
if (!empty($_SERVER["HTTP_CLIENT_IP"])) {
$cip = $_SERVER["HTTP_CLIENT_IP"];
} elseif (!empty($_SERVER["HTTP_X_FORWARDED_FOR"])) {
$cip = $_SERVER["HTTP_X_FORWARDED_FOR"];
} elseif (!empty($_SERVER["REMOTE_ADDR"])) {
$cip = $_SERVER["REMOTE_ADDR"];
} else {
$cip = "无法获取!";
}
return $cip;
}
五:php 生成验证码 并 验证
//极速验证
public function verifys(){
需要引入位于指定路径下的文件,即包含 '/lib/class.geetestlib.php' 的文件,该文件的路径是当前文件所在目录的上一级目录的上一级目录。
需要引入位于当前文件目录的上一级目录下的 config.php 文件,即 require_once dirname(dirname(__FILE__)).'/config/config.php';
创建一个名为 $GtSdk 的对象,该对象是通过 new GeetestLib 函数创建的,传入的参数分别是 CAPTCHA_ID 和 PRIVATE_KEY 。
$geetest_id = "7149e2021d7938157e9";
$geetest_key = "62b92039e1e9cf";
$geetest=new \Org\Util\Xb\GeetestLib($geetest_id,$geetest_key);
//dump($geetest);die;
$user_id = "test";
$data = array(
"user_id" => $user_id, # 网站用户id
"client_type" => "web", #web:电脑上的浏览器;h5:手机上的浏览器,包括移动应用内完全内置的web_view;native:通过原生SDK植入APP应用的方式
"ip_address" => GetIP(), # 请在此处传输用户请求验证时所携带的IP
);
$status 等于 $geetest 对 $data 进行预处理的结果。1);
//dump($status);
$_SESSION['geetest']=array(
'gtserver'=>$status,
'user_id'=>$user_id,
'ip_address'=>GetIP(),
);
echo调用 $geetest 的 get_response_str 方法。
}
public function cdtsh_log_smfyws() {
if ($_SESSION['userid']) {
$this->redirect('Admin/Index/Index');
} else {
if (IS_POST) {
$username = $_POST['username'];
$password = $_POST['password'];
$geetest_challenge 等于 $_POST 中的 'geetest_challenge' ;
将 `$_POST['geetest_validate']` 的值赋给 `$geetest_validate` 。
$_POST 里的 'geetest_seccode' 被赋予给了 $geetest_seccode 。
$data=I('post.');
if($data['geetest_challenge']=="" || $data['geetest_validate']=="" ||$data['geetest_seccode']=="" ){
$this->error('请进行图形验证');
}else{
调用 geetest_chcek_verify 函数并传入 $data 进行 dump 操作。
if若 (geetest_chcek_verify($data) 的结果为假) ,则采取其他措施。
//echo '验证成功';
if ($this如果调用 loginAdmin 函数并传入 $username 和 $password 后返回值为真,则执行以下操作;如果调用 loginAdmin 函数并传入 $username 和 $password 后返回值为假,则不执行以下操作。
$data = M("User")->where("username='".$username."' and password='".md5($password)."'")->find();
if ($data["status"] != 1) {
//判断是否禁用
$this->recordLoginAdmin($_POST['username'], $_POST['password'], 0, "账号禁用"); //记录登录日志
$this->error('该帐号禁用');
} else {
$save["lastlogin_time"] = time();
$save["lastlogin_ip"] = get_client_ip();
$save["login_num"] = $data["login_num"] + 1;
$status = M("user")->where(array("id" => $data['id']))->save($save);
$_SESSION['userid'] = $data['id'];
$_SESSION['user'] = $data['username'];
$_SESSION['rid'] = $data['a_Id'];
$this->recordLoginAdmin($_POST['username'], $_POST['password'], 1); //记录登录日志
$this->redirect('Admin/Index/Index');
登录成功,跳转至 U('Admin/Index/Index') 。
}
} else {
$this->recordLoginAdmin($_POST['username'], $_POST['password'], 0, "账号密码错误"); //记录登录日志
$this->error('登录失败');
}
}else{
//echo '图形验证失败';
$this->error('图形验证失败');
}
}
} else {
$this->display();
}
}
}
效果图如下:
登录页面
点击验证后
以上内容涵盖了文章的全部。若有需要进行学习以及经验交流的朋友,可以添加小编。我们可以一同学习,遇到问题一起交流,共同进步。
让学习成为一种习惯
长按二维码加好友
学习 | 交流 | 分享 | 文章