thinkphp中session跨域问题解决

thinkphp中session跨域问题解决

本地使用,一切正常;后端项目和前端项目都部署到服务器,一切正常;后端项目部署到服务器,并设置允许跨域访问后,本地前端项目使用服务器上后端项目接口时,问题来了:

首先,使用postman测试获取图片验证码接口和验证图片验证码接口,正常。

然后,在html中使用获取图片验证码接口,正常;最后,在JS中使用验证图片验证码接口,出错!!!

分析

通过问题描述,我们看出,问题出现在跨域上。那么,有两种可能,一种是因为跨域设置不正确;一种是因为thinkphp本身的问题。

立即学习“PHP免费学习笔记(深入)”;

采用另外一种跨域配置,问题依然存在。那就是thinkphp本身的问题了,经查找资料,问题定位在thinkphp的session跨域上。

跨子域解决办法

其实不管是ThinkPHP还是php本身,在解决session跨域问题的时候都需要设置session.cookie_domain。
针对session跨域这一问题的解决方法主要有以下几种:

第一种情况:如果目录下没有.htaccess这个文件,也就是没有采取url伪静态的话,那么,在conf/config.php的第一行加上:

ini_set('session.cookie_domain',".domain.com");//跨域访问Session

这时如果你开启了调试,那么可以用!但关闭了调试,就不管用了!

第二种情况:如果你目录下有.htaccess这个文件,那么你在根目录,index.php的第一行加入:


这种方法不管开不开启调试都管用!

然而,我们的问题并不是跨子域的问题,而是完全跨域,所以上述方法无效。

完全跨域解决办法

获取图片验证码请求

查看获取图片验证码的请求信息,Request Headers为:

Accept:image/webp,image/*,*/*;q=0.8Accept-Encoding:gzip, deflate, sdchAccept-Language:zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4Connection:keep-aliveCookie:pma_lang=zh_CN; pma_collation_connection=utf8_unicode_ci; pma_iv-1=wnpO4gv0eQRW1AMHmGr2ww%3D%3D; pmaUser-1=weZPqS0%2BW7nzFUVHRdqcfA%3D%3DHost:api.voidking.comReferer:http://localhost/ajax/ajax.htmlUser-Agent:Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36

Response Headers为:

Access-Control-Allow-Origin:*Cache-Control:post-check=0, pre-check=0Cache-Control:private, max-age=0, no-store, no-cache, must-revalidateConnection:keep-aliveContent-Type:image/pngDate:Sun, 27 Nov 2016 12:10:44 GMTExpires:Thu, 19 Nov 1981 08:52:00 GMTPragma:no-cacheServer:nginxSet-Cookie:PHPSESSID=721t4sqanvsii550m1dk8gq1o3; path=/; domain=.voidking.comTransfer-Encoding:chunked

验证验证码请求

查看验证验证码的请求信息,Request Headers为:

Accept:application/json, text/javascript, */*; q=0.01Accept-Encoding:gzip, deflateAccept-Language:zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4Connection:keep-aliveContent-Length:9Content-Type:application/x-www-form-urlencoded; charset=UTF-8Host:api.voidking.comOrigin:http://localhostReferer:http://localhost/ajax/ajax.htmlUser-Agent:Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36

Response Headers为:

Access-Control-Allow-Origin:*Cache-Control:no-store, no-cache, must-revalidate, post-check=0, pre-check=0Connection:keep-aliveContent-Encoding:gzipContent-Type:text/html; charset=UTF-8Date:Sun, 27 Nov 2016 12:13:21 GMTExpires:Thu, 19 Nov 1981 08:52:00 GMTPragma:no-cacheServer:nginxSet-Cookie:PHPSESSID=149t0hhs2icqaaemvp39onkgp4; path=/; domain=.voidking.comTransfer-Encoding:chunkedVary:Accept-Encoding

再次获取图片验证码请求

Request Headers为:

Accept:image/webp,image/*,*/*;q=0.8Accept-Encoding:gzip, deflate, sdchAccept-Language:zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4Cache-Control:max-age=0Connection:keep-aliveCookie:pma_lang=zh_CN; pma_collation_connection=utf8_unicode_ci; pma_iv-1=wnpO4gv0eQRW1AMHmGr2ww%3D%3D; pmaUser-1=weZPqS0%2BW7nzFUVHRdqcfA%3D%3D; PHPSESSID=721t4sqanvsii550m1dk8gq1o3Host:api.voidking.comReferer:http://localhost/ajax/ajax.htmlUser-Agent:Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36

Response Headers为:

Access-Control-Allow-Origin:*Cache-Control:private, max-age=0, no-store, no-cache, must-revalidateCache-Control:post-check=0, pre-check=0Connection:keep-aliveContent-Type:image/pngDate:Sun, 27 Nov 2016 13:26:21 GMTExpires:Thu, 19 Nov 1981 08:52:00 GMTPragma:no-cacheServer:nginxTransfer-Encoding:chunked

三次请求比较

1.jpg

第一次获取图片验证码请求,Cookie中没有PHPSESSID,所以,返回信息中有Set-Cookie。第二次获取图片验证码请求,Cookie中含有PHPSESSID,所以,返回信息中没有了Set-Cookie。

而且第一次请求返回信息Set-Cookie中的PHPSESSID,和第二次请求请求信息Cookie中的PHPSESSID是相同的。

而验证图片验证码的ajax请求,没有Cookie,自然也没有PHPSESSID,所以,返回信息中也有Set-Cookie。

可见,我们需要在前端做一些修改,使之发送请求时带着Cookie。

前端jquery设置

        jquery    

thinkphp中session跨域问题解决

$(function(){ $('#send').click(function(){ //console.log(document.cookie); $.ajax({ url: 'http://api.voidking.com/owner-bd/index.php/Home/CheckCode/checkPicCode', type: 'POST', crossDomain: true, xhrFields: { withCredentials: true }, dataType: 'json', data: {code: $('#picCode').val()}, success: function(data){ console.log(data); }, error: function(xhr){ console.log(xhr); } }); }); });

请求时报错如下:

A wildcard '*' cannot be used in the 'Access-Control-Allow-Origin' header when the credentials flag is true. Origin 'http://localhost' is therefore not allowed access. The credentials mode of an XMLHttpRequest is controlled by the withCredentials attribute.

出现了跨域报错,可见后端也需要做一些修改,使之可以接收跨域Cookie。

后端nginx设置

add_header Access-Control-Allow-Origin http://localhost;add_header Access-Control-Allow-Credentials true;

注意:
服务器端Access-Control-Allow-Credentials参数为true时,Access-Control-Allow-Origin参数的值不能为*。

后端nginx设置后,jquery的ajax请求正常了,可以携带Cookie,后端正常接收数据并返回数据。

由于angular的ajax请求不同于jquery,所以,我们还需要研究一下angular怎么发送携带Cookie的跨域请求。

前端angular设置

        angular        

thinkphp中session跨域问题解决

var app = angular.module('myApp', []); app.controller('myCtrl', function($scope, $http, $httpParamSerializer) { $scope.send = function(){ $http({ method:'POST', url:'http://api.voidking.com/owner-bd/index.php/Home/CheckCode/checkPicCode', headers:{ 'Content-Type':'application/x-www-form-urlencoded' }, withCredentials: true, dataType: 'json', data: $httpParamSerializer({code: $scope.picCode}) }).then(function successCallback(response) { console.log(response.data); $scope.username = response.data.username; }, function errorCallback(response) { console.log(response.data); }); } });

推荐教程:《TP5》

以上就是thinkphp中session跨域问题解决的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/88962.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月18日 01:57:08
下一篇 2025年11月18日 02:56:07

相关推荐

  • Symfony 如何将LDAP条目转为数组

    使用php原生ldap_*函数时,需手动遍历ldap_get_entries()返回的嵌套数组,跳过数字索引和count键,将每个属性值(通常为数组)根据其count字段提取为单值或数组,并保留dn,最终构建成干净的关联数组;2. 使用symfony的ldap组件时,通过query执行后得到entr…

    好文分享 2025年12月10日
    000
  • Symfony 怎样把浏览器Cookies转数组

    在symfony中,通过request对象的cookies属性(parameterbag实例)调用all()方法即可将浏览器发送的cookies直接转换为php关联数组;2. 安全读取和处理cookie数据时,应避免存储敏感信息,仅使用cookie保存标识符,并将在服务器端存储实际数据,同时对输入进…

    2025年12月10日
    000
  • Symfony 怎样把Neo4j节点转为数组

    最直接的方法是调用neo4j节点对象的properties()方法,它会返回包含所有属性的关联数组;2. 对于复杂场景,可通过自定义mapper服务或使用symfony serializer组件处理日期、标签、关系及嵌套结构;3. 为提升性能,应在cypher查询中只返回必要属性,并避免orm的额外…

    2025年12月10日
    000
  • Symfony 怎样将MongoDB文档转数组

    在 symfony 中将 mongodb 文档转换为数组最直接的方式是使用 doctrine odm 提供的 toarray() 方法,适用于简单文档结构;2. 常见应用场景包括构建 restful api 响应、数据导出、日志调试、表单预填充和缓存处理;3. toarray() 方法的主要局限性在…

    2025年12月10日
    000
  • PHP如何创建在线租赁平台?押金与租金计算

    处理租赁期间商品损坏的核心是建立明确的规则与保障机制,1、在租赁协议中清晰界定损坏赔偿标准,如按损坏程度扣除部分或全部押金;2、要求用户租赁前进行实名认证以提高违约成本;3、可引入保险机制,为商品购买保险以分摊平台与用户风险;4、平台应提供便捷的损坏申报与评估流程,确保处理公正透明,最终保障交易双方…

    2025年12月10日
    000
  • PHP数组键值字符串匹配与条件赋值教程

    本教程详细阐述了在PHP中如何遍历数组,并根据其键(key)是否等于特定的字符串值来执行相应的逻辑,例如为变量赋值。文章将深入探讨PHP数组键的特性、foreach循环的正确使用方法,并澄清常见的误区,如array_key_exists()和isset()在遍历场景下的适用性,旨在帮助开发者高效、准…

    2025年12月10日
    000
  • PHP如何创建自动发货系统?虚拟商品卡密生成

    卡密生成需结合随机数、时间戳与哈希算法(如md5(uniqid(rand(), true)))确保唯一性和复杂性,并在数据库中为卡密字段建立唯一索引防止重复;2. 支付成功后,系统通过支付网关的异步回调通知触发发货流程,接收回调数据后需进行验签、核对订单信息,并使用数据库事务保证订单更新、卡密分配与…

    2025年12月10日
    000
  • Symfony 如何将YAML配置转为PHP数组

    symfony通过yaml组件将yaml配置转换为php数组,1. 首先安装symfony/yaml组件;2. 使用yaml::parsefile()或yaml::parse()方法解析文件或字符串;3. 处理解析结果并进行错误捕获;4. 在实际项目中可用于加载自定义配置、处理用户上传、动态生成配置…

    2025年12月10日 好文分享
    000
  • PHP如何开发二级域名分销系统?白标解决方案

    实现动态二级域名解析与路由需配置dns泛解析(*.yourmaindomain.com指向服务器ip)并结合nginx或apache的虚拟主机匹配请求,通过正则捕获二级域名作为租户标识,再由php从$_server[‘http_host’]提取并识别租户;2. 多租户数据管理…

    2025年12月10日
    000
  • Symfony 如何将调试信息转为数组

    要将symfony的dump()函数输出转换为程序可处理的php数组,必须绕过默认渲染机制,直接操作vardumper组件的内部结构;具体步骤是:1. 使用varcloner克隆变量生成data对象;2. 创建自定义arraydumper类继承abstractdumper,递归遍历data对象和st…

    2025年12月10日
    000
  • Symfony 怎么把基准测试结果转数组

    首先使用phpbench生成json格式的基准测试报告,可通过配置phpbench.json文件或命令行参数实现;2. 然后使用php的file_get_contents读取生成的json文件;3. 接着调用json_decode($jsondata, true)将json内容转换为php关联数组;…

    2025年12月10日
    000
  • PHP怎样实现付费问卷调查系统?奖励发放机制

    构建php付费问卷调查系统的奖励发放机制需围绕用户认证、问卷管理、数据收集和积分提现四大模块展开,采用现代php框架如laravel提升开发效率;2. 数据安全方面须实施输入验证、过滤、敏感数据加密,并借助orm防止sql注入,避免存储用户支付信息以降低风险;3. 防作弊策略应结合ip与设备指纹识别…

    2025年12月10日
    000
  • Symfony 如何把验证错误转为数组

    在symfony中处理验证错误时,需将constraintviolationlist对象转换为数组以便于前后端交互、日志记录和结构化输出;2. 转换的核心方法是遍历constraintviolationlist,提取每个constraintviolation的属性路径、错误消息等信息,并按字段名分组…

    2025年12月10日
    000
  • PHP怎样开发竞价排名系统?广告位拍卖逻辑

    竞价排名核心算法包括“出价 × 质量得分”排序和第二价格拍卖(gsp)计费,质量得分综合点击率、相关性和落地页体验;2. 公平性通过透明规则、gsp机制和质量得分保障,效果则通过提升广告相关性和用户价值实现平衡;3. php开发面临实时性与高并发挑战,需依赖缓存、数据库优化、异步处理、水平扩展和分布…

    2025年12月10日
    000
  • Symfony 怎样将API令牌信息转数组

    在symfony中,将api令牌(如jwt)转换为数组的核心是解析其payload部分,需先从authorization头获取令牌,分割字符串取第二部分,进行base64 url安全解码并json_decode为php数组;2. 安全处理api令牌需依赖symfony security组件,通过签名…

    2025年12月10日
    000
  • PHP怎样制作付费简历解析?人才库变现方案

    制作付费简历解析系统的核心在于整合第三方解析服务或自研模块,并结合支付与用户管理体系实现变现。1. 优先推荐整合第三方简历解析api,通过php调用接口获取结构化数据,实现高效准确的解析;2. 自研解析模块需处理多种文件格式、应用ocr及nlp技术提取信息,但开发难度高,适合有资源和技术积累的团队;…

    2025年12月10日
    000
  • PHP中根据数组键值进行条件判断与变量赋值

    本文详细阐述了在PHP中如何遍历数组,并根据数组键(key)的特定字符串值进行条件判断,进而动态地为其他变量赋值。通过foreach循环直接访问数组键,结合严格相等运算符===,可以高效地实现对指定键的识别与处理,即便数组中包含混合类型的键(字符串键与数字键)。本教程将提供清晰的代码示例,并探讨相关…

    2025年12月10日
    000
  • Symfony 怎么将权限列表转为数组格式

    从用户角色中提取权限时,若角色对象有getpermissions()方法,则合并其返回的权限数组,否则将角色名称作为权限添加;2. 若权限通过permission实体存储,则遍历角色关联的permission实体集合,调用getname()方法获取权限名称并加入数组;3. 使用authorizati…

    2025年12月10日
    000
  • Symfony 如何将多语言文本转为数组

    symfony通过yaml或xml组件将多语言文本文件解析为php数组,便于直接访问结构化翻译数据;2. 使用yaml::parsefile()读取如messages.zh_cn.yaml文件内容并转换为数组;3. 通过translationarrayconverter服务按指定语言和域动态获取翻译…

    2025年12月10日
    000
  • PHP:遍历数组并根据键名执行条件操作

    本教程旨在详细阐述在PHP中如何高效地遍历数组,并根据数组键的特定字符串值执行条件逻辑。文章将通过具体的代码示例,演示如何利用foreach循环直接访问和比较数组的键,从而实现基于键名进行变量赋值或其他操作,同时也会指出常见的误区和最佳实践,确保代码的准确性和可读性。 1. 理解PHP数组及其键的特…

    2025年12月10日
    000

发表回复

登录后才能评论
关注微信