解决了uploadify上传文件时,某些浏览器(版本)中,session丢失导致上传失败的问题

一、问题

近期,在做文件上传时,使用了uploadify这个基于flash的文件上传组件,版本号为3.2.1。在IE下,一切正常,但是当切换到某些低版本chrome浏览器后,发生了文件不能上传的问题。

通过调试和问题定位,发现是session丢失,导致服务端不能识别登录状态,所以报异常。

经过fiddler抓包,正常上传时,request报文头如下:

POST /rmwlgzpt/webApp/backlog4kf/upload HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Content-Length: 1969
Origin: http://localhost:8080
X-Requested-With: ShockwaveFlash/29.0.0.171
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36
Content-Type: multipart/form-data; boundary=----------ei4ae0cH2GI3KM7ei4ae0GI3cH2Ef1
Accept: */*
Referer: http://localhost:8080/rmwlgzpt/webApp/desktop
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: JSESSIONID=6CAC4C62A0DCE5FF1603192B242C9105

而在某些低版本chrome浏览器中,其request报文头为:

POST /rmwlgzpt/webApp/backlog4kf/upload HTTP/1.1
Accept: text/*
Content-Type: multipart/form-data; boundary=----------gL6ei4Ij5cH2gL6gL6Ef1ei4Ef1gL6
User-Agent: Shockwave Flash
Host: localhost:8080
Content-Length: 91295
Connection: Keep-Alive
Pragma: no-cache

可以看到,报文头少了好多东西,特别是最关键的session信息:

Cookie: JSESSIONID=6CAC4C62A0DCE5FF1603192B242C9105

由此可以确定,是因为uploadify上传组件的flash文件上传机制以及低版本chrome联合导致了这一问题,当然通过升级浏览器版本可以解决,但是公司的一些情况导致浏览器(核心)不能升级,所以只好从程序上入手解决。

二、解决办法

1. 在Java后端,获取到当前session id,代码如下:

HttpSession session = request.getSession(false);
if(null != session) {
    String jsessionid = session.getId();
    model.addAttribute("jsessionid", jsessionid);
}

2. 修改模板文件

这里页面模板用的是velocity,所以在模板中增加一个隐藏元素,来记录当前的session id,代码如下:

<input type="hidden" id="ipt_backlog4kf_attachment_jsessionid" name="attachment_jsessionid" value="$jsessionid">

3. 修改文件上传JavaScript文件

在JavaScript文件上传代码中,在原有的文件上传处理路径后边加上session id相关的内容,代码如下(一定要用分号;):

"uploader" : "backlog4kf/upload;jsessionid=" + $("#ipt_backlog4kf_attachment_jsessionid").val(),
因为服务器端是Tomcat,所以参数名为jsessionid,如果是其他服务器,则名称相应也要做变化,具体可以查找资料确定名称。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值