美文网首页PHP经验分享
thinkphp5 跨域验证码

thinkphp5 跨域验证码

作者: 小菜攻城狮 | 来源:发表于2019-08-16 10:37 被阅读0次

假设

前端域名为:http://a.com

服务端域名为:http://b.com

前端页面地址为:http://a.com/index.html

获取验证码地址:http://b.com/home/verify

验证验证码地址:http://b.com/home/check_verify

事例:前台地址http://a.com要向服务端地址http://b.com验证和请求验证码

  1. 跨域服务端php必须要设置header
header('Access-Control-Allow-Credentials: true');//服务器端要通过在响应 header 中设置Access-Control-Allow-Credentials = true来运行客户端携带证书式的访问
header('Access-Control-Allow-Origin: http://a.com'); //当服务器端 Access-Control-Allow-Credentials = true时,参数Access-Control-Allow-Origin 的值不能为 '*',建议尽量指定请求域名 。
  1. 前端页面代码
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>ajax-test</title>
</head>
<body>
    <img id="img" src="http://b.com/home/verify" />
    <input type="text" name="code" />
    <div id="J_AjaxTest">提交</div>
    <script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>
    <script>
        $(function(){
            $('#J_AjaxTest').bind('click', function(event) {
                var code = $("input[name='code']").val();
                $.ajax({
                    url: 'http://b.com/home/check_verify',
                    type: 'GET',
                    xhrFields: {
                        withCredentials: true // 验证请求最重要的一段代码,这里设置了withCredentials为true
                    },
                    data: {code: code},
                    success : callback
                })
            });
            function callback (obj){             
                console.log(obj);
            }
        })
    </script>
</body>
</html>
  1. 完成验证

原理:因为在加载验证码图片的时候请求中携带了cooike,cooike中存了服务端验证码的PHPSESSID。而在验证过程中因为是跨域请求,ajax是不会携带cooike进行提交的。因此需要在ajax设置withCredentials为true时表示当前请求为跨域类型在请求中协带cookie,并且服务端也必须要设置Access-Control-Allow-Credentials:为true才可以起到实际的效果。

顺便贴一下进行请求和验证的两个方法:

//获取图片验证码
public function verify(){
    $captcha = new Captcha();
    return $captcha->entry();
}

//验证提交验证码信息是否正确
function check_verify( ){
    $code = input('code');
    $captcha = new Captcha();
    return $captcha->check($code);
}

相关文章

  • thinkphp5 跨域验证码

    假设 前端域名为:http://a.com 服务端域名为:http://b.com 前端页面地址为:http://...

  • vue的webpack脚手架开发中使用了代理转发proxyTab

    项目中遇到跨域问题,在不设置CORS跨域的情况下,开发使用代理解决跨域问题。流程: 先获取验证码,直接加载url的...

  • ThinkPHP5框架

    ThinkPHP5 + Lamp ThinkPHP5用Composer安装命令看官网文档 安装完配置项目 配置好域...

  • 深入跨域问题(3) - 利用 JSONP 解决跨域

    深入跨域问题(1) - 初识 CORS 跨域资源共享;深入跨域问题(2) - 利用 CORS 解决跨域深入跨域问题...

  • 关于设置env等环境变量的思考

    1、如何处理跨域后台处理跨域前端处理跨域浏览器处理跨域 前端本地处理跨域:代理线上跨域的处理方式:Nginx反向代...

  • Web前后端跨域问题处理

    跨域问题有前台跨域(iframe间)和后台跨域。 前台跨域的解决方案可以采用跨域文档通讯(Cross domain...

  • 跨域

    跨域 什么是跨域: 解决跨域 通过jsonp原理:在页面引入跨域js和css时,没有存在跨域问题.因此可以动态创建...

  • 跨域问题详解分析

    参考文档 CORS详解 跨域资源共享 CORS 详解 js中几种实用的跨域方法原理详解 跨域的那些事儿 跨域与跨域...

  • 跨域问题:好几种解决方案

    跨域分为广义跨域和狭义跨域 广义跨域:一个域下的文档或脚本试图去请求另一个域下的资源; 广义跨域可以分为以下几种:...

  • ajax readystatus=0;status=0 报错

    跨域 跨域 跨域 一定要找运维或者后台解决

网友评论

    本文标题:thinkphp5 跨域验证码

    本文链接:https://www.haomeiwen.com/subject/blhfsctx.html