基于session 认证时swfupload 上传失败
最近使用swfupload 做上传。环境是swfupload 2.2 ,tomcat 7。上传需要登录,登录状态session 记录。
最初是session 获取不到,最一个公共方法在链接上带上session id ,测试ie,chrome ,firefox 都ok。
没两天测试发现,360 极速上传失败,302错误,分析发现session 没找到。开始以为是360 原因,调试发现cookie 竟然有session id,但不是登录用户的session id,并且那个session id 服务器里并不存在,后面切换到swf2.5 版本,cookie 不见了,上传依然失败,这才发现拷贝过来的代码id名称由 jsessionid 写成了 jsessionId ,结果导致该参数无效。
/** * swfupload 上传路径加上session id * @param url 相对路径 * @returns {String} */ function uploadUrl(url,sessionId){ return getRootPath()+url+";jsessionid="+sessionId; }
拷贝害死人。
还有比较奇怪的,刚开始测试360极速 cookie 竟然会有session id值,而其他浏览器都没有,这也导致发了很长时间去找浏览器的原因。后面sessionid 名称修复后,并还原到swfupload 2.2 再测试, cookie 不存在了,很奇怪的问题。
org.apache.catalina.connector.CoyoteAdapter
String sessionID = null; if (request.getServletContext().getEffectiveSessionTrackingModes() .contains(SessionTrackingMode.URL)) { // Get the session ID if there was one sessionID = request.getPathParameter( SessionConfig.getSessionUriParamName( request.getContext())); if (sessionID != null) { request.setRequestedSessionId(sessionID); request.setRequestedSessionURL(true); } } // Look for session ID in cookies and SSL session parseSessionCookiesId(req, request);
由此想到了一个问题,如果cookie 和url 都存在session id ,但值不一致会以谁优先呢。
经过分析tomcat 7 源码发现, 默认情况下 url 中session id 会首先解析,如根据url session id 找不到相应的session 才会使用cookie session id 去找。
相关源代码如下: