一、问题
近期,在做文件上传时,使用了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,如果是其他服务器,则名称相应也要做变化,具体可以查找资料确定名称。