关于跨域请求携带cookie和tp6文件上传

关于cookie,session,token

cookie是保留在客户端的文本信息,而session是保留在服务器端的数据,相当于为用户颁发了一个小卡片标记了用户的id,每次访问的时候通过这个id就能找到存储在客户端的用户信息。为了记录客户留下的信息,特别是记住用户登录的状态,在第一次注册或者登录时,创建一个session对象存储必要信息,在responseHeaders里面用set-cookie保存一个cookie值,下次访问浏览器就会在requestHeaders携带这个值。所以一个cookie一定对应唯一的session,因为它是由session产生的。我是这么理解,望大佬更正。

而token更方便。在第一次登录时通过特定的加密方式生成一个字符串,把字符串传给前端,前端每次访问都携带这个字符串,后端解析出用户信息。登出时只需前端把字符串销毁。

跨域请求

当请求的域名和被请求的域名不一致,一级域名,包括二级域名,就无法得到请求数据。tp6只需在中间件开启跨域请求就好了:

\think\middleware\AllowCrossDomain::class,

但是到今天前端正式工作 我才意识到cookie存在crsf问题,即比如你访问google会得到一个cookie,但不会在访问百度时携带该cookie吧。下午发现localhost访问自带cookie,但访问服务器的ip地址就不能携带,经过学习发现是跨域。那好,我在headers里面自己添加,可以生效。后来把测试文件放到服务器上,本以为生效,没想到不行。琢磨了很久,chrome在responseHeaders的set-cookie有警告:

PHPSESSID=; path=/;domain=localhost

cookie.domain属性代表在该域名下可以使用cookie,子域名也可。一番折腾发现tp6的cookie.php默认domain为localhost。一不做二不休把它改为空,然后ip地址下访问就可以了。接下来解决跨域请求携带cookie问题,经过搜索发现在ajax下加入两行:

xhrFields:{withCredentials: true},
crossDomain:true,

后端也要改,在跨域中间件加入:

header("Access-Control-Allow-Origin: *");

允许任何域名访问
另外ajax的post请求Content-Type,但仅能是下列之一:

application/x-www-form-urlencoded
multipart/form-data
text/plain

经过尝试发现还是chrome还是有警告,这时对应一篇博客
chrome警告
解决之后终于解决,为前端调试的一天,自己也学到很多东西。token我是用jwf,感觉更方便,附上大佬博客:
tp6+jwf

tp6头像上传

当初在写头像上传代码的时候忽略了重新上传要删除原来的头像(感觉之前的代码不够规范,很多需要重写)。所以尝试用unlink。附上unlink的参数规范:

$picurl='../public/static'.$array['image'];//系统默认的绝对路径

然而删除成功后居然出现了新问题,明明之前测试没有过

Argument 2 passed to think\filesystem\Driver::putFile() must be an instance,null given

null?明明我上传了文件啊,看了下tp6的官方文档。form表单要传参数:

enctype="multipart/form-data"

然后又报错了,说Argument 2是array given。傻了,直接用它的代码:

$file = request()->file('image');

验证的时候用验证器,先转化为array,结果总算可以了。五一第一天就这样折腾了一天,剩下的api还没写,复习还没复。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值