小心swfupload 的cookie Bug

6次阅读

  使用 SWFUpload 的时候一定要小心 cookie bug:在非 IE 内核内核的浏览器下使用 SWFUpload 上传文件时,该请求会忽略自身浏览器中的所有 cookie,只会将 IE 浏览器下的属于该域的持久 cookie(persistent cookies) 发送到服务端,非持久 cookie(Session only)不会被发送。遗憾的是此 Bug 并非是 SWFUpload 内部实现的问题(所有的 Flash 上传都会存在此 bug),而是 FlashPlayer 的 bug,所有使用 FileReference 类上传文件时会存在此问题。幸运的是我们有办法绕开此陷阱。

假设一种使用场景,用户登录系统以后,我们会在 cookie 中写入一个非持久的 key 值来判断用户身份。当用户使用 SWFUpload 上传文件的时候,服务端程序通过 Requeset 中的 cookie 来判断用户身份。在 IE 下我们的功能正常,但在 FF 下你会发现服务端脚本从 Request 中取到的 cookie 是空的,这就是很多人遇到的 cookie 丢失。前面我也提到了非 IE 内核的浏览器忽略了自身的所有 cookie。

假如用户同时在 IE 下登录了另外一个账号,并且选择了记住账号,那么我们的程序逻辑可能会写入一个持久的 key 值。然后用户在 FF 下上传照片,服务端是接受到 cookie 中的 key 值了,但遗憾的是此 key 是 IE 下登录账号的 cookie,一不小心这就造成了用户身份判断错误的 bug,A 用户传了张照片居然是属于 B 用户的。

解决方法:

幸运的是 AS3 提供的 URLRequest 对象来包装客户端请求,我们可以上传文件的同时,给请求添加 POST 值对。因此当我们的上传程序需要依赖客户端 cookie 的时候,我们可以在上传开始前使用 JS 将我们需要的 cookie 读取出来,然后使用 SWFUpload 提供的 addPostParam 方法添加到 POST 中去,服务端从 POST 中接受所需要的 "cookie" 值即可,不再依赖 Request 中的 cookie 机制。

正文完