Java 利用 SWFUpload多文件上传 session 为空失效,不能验证的问题

1806人阅读 评论(1) 收藏 举报
分类:

原文转自:http://www.tqcto.com/article/code/295299.html

我们都知道普通的文件上传是通过表单进行文件上传的,还不能达到异步上传的目的。通过使用某些技术手段,比如jquery form.js可以达到异步上传的目的,但最重要的问题在于,它不能够进行多个文件的上传。如果你要上传多个文件,必须一个一个地上传,同时还要在界面上处理当上传完一个文件之后,下一个文件上传框的问题。
    现在我们有了一个更多的运行,即使用swfupload进行多文件异步上传。顾名思义,它是一个flash的上传工具,但在界面上的表现形式使它和普通的html元素一样,没有复杂的展现,就一个普通的上传框,即可达到想要目的。

    关于swfupload 编程技术 的使用这里自不必多,这里主要介绍的是解决在java web开发过程中经常碰到的验证失败的问题。这是因为flash在上传的时候使用的是和浏览器不同的会话,flash的SWFUpload上传利用socket套接字进行通信,所以导致session和原来上一次的会话不同,导致session丢失。这样就导致服务器在验证时自然被认为是新会话,从而验证不能通过,导致上传不能成功了。
    解决问题的方法,就是让flash在上传文件的时候带上同在一个界面的session标识,这通常是修改其中的upload_url来达到我们的目的,修改如下所示:

upload_url: "/admin/infobuild/image/upload.action;jsessionid=${pageContext.session.id }"


上面这句话,必须放到jsp界面上,因为里面使用到了JavaWeb的语法,当然这可以修改,通过将<%=session.getId()%> 或 ${pageContext.session.id } 放到特殊的js变量中,可以达到隐藏变量的目的。比如如下的代码:

<!-- 这句要房子jsp页面中的script脚本中,或是放在servlet的response.getWriter()流中的script脚本中;总之要在swfupload 的js引入之前执行 -->
window["sessionId"]="${pageContext.session.id}";
<!-- 这句话就可以在引入的js中使用 -->
upload_url: Gtip.util.addContextPath("/admin/infobuild/image/upload.action;jsessionId"  + "=" + window["sessionId"]),

以上方案是解决在jsp页面中解决的取值java的变量值;

如上代码的第一句放到jsp文件中,如jsp的公共include文件中。下面一句就放到js文件中,如引入的upload.js文件当中。
    但以上代码还存在一个问题,就是默认的sessionName问题。在tomcat或者其它j2ee容器,默认的sessionName也是 jsessionId。如果我们修改了sessionName如通过tomcat的server.xml修改session_cookie_name,这样默认的sessionName就是我们修改之后的了。解决此问题,需要再加一个参数设置才可,如下所示:

 

<!-- 这三行放在include 导入的那个jsp的页面中 -->
window["contextPath"] = "${pageContext.request.contextPath}";
window["sessionId"] = "${pageContext.session.id}";
window["sessionName"] = "jsessionId";
 
// js中使用jsp中设置的window的变量值
upload_url: addContextPath("/admin/infobuild/image/upload.action;" + window["sessionName"] + "=" + window["sessionId"])


以上代码的前三行放到公共的include.jsp中,最后一行放到公共的upload.js中。这样即可满足最终要求了。
不过有一点不好的即是,在部署环境中时,如果部署环境修改了sessionName,则必须在此include.jsp中修改一个具体的sessionName才可。


查看评论

解决报错:Session为空(未将对象引用设置到对象的实例)

项目中不能使用session ,断点调试也显示session为空,不知道从何入手,网上的资料查了都不符合要求,系统仍旧跑不起,真是要烦躁死。 后来问了下同事。 问题出现在web.config中,里面有...
  • fangzilixia
  • fangzilixia
  • 2016-03-17 09:49:31
  • 2613

让微信小程序每次请求的时候不改变session_id的方法

让微信小程序每次请求的时候不改变session_id的方法 每次微信小程序请求的时候都会改变session id, 还好他的请求方法内可以设置header头 所以只需要在启动程序后第一次请求服务器获得...
  • Mad_Geek
  • Mad_Geek
  • 2016-11-13 12:16:27
  • 22897

session的根本原理及安全性

yunnysunny  退出账号 当前文档  删除文档 导出 Markdown 导出 PDF 系统  设置 下载离线客户端 使用说明 快捷帮助 切换至免费版 ...
  • yunnysunny
  • yunnysunny
  • 2014-05-25 09:47:07
  • 12444

关于Ajax跨域访问 session不能保存或之后无法访问session取值为空等问题

根据浏览器的保护规则,跨域的时候我们创建的sessionId是不会被浏览器保存下来的,这样,当我们在进行跨域访问的时候,我们的sessionId就不会被保存下来,也就是说,每一次的请求,服务器就会以为...
  • sinat_34930640
  • sinat_34930640
  • 2017-09-27 00:27:35
  • 487

Java 利用SWFUpload多文件上传 session 为空失效,不能验证的问题

Java 利用SWFUpload多文件上传 session 为空失效,不能验证的问题      我们都知道普通的文件上传是通过表单进行文件上传的,还不能达到异步上传的目的。通过使用某些技术手段,...
  • awe5566
  • awe5566
  • 2013-08-23 00:08:14
  • 647

Session传值为空,终于解决了

Session传值为空,提示未将对象引用设置到对象的实例
  • cqunknown
  • cqunknown
  • 2008-01-11 15:34:00
  • 1259

解决ssh项目用swfupload上传文件时session丢失问题.

在ssh项目中集成了swfupload做文件上传,之前一直都工作得挻好,直到新杀到一员工,他的机器新颖,预装的是IE9,我叫他卸了,装IE8(因为项目主要是在IE8中使用),结果win7提示不能装IE...
  • zhanngle
  • zhanngle
  • 2012-05-05 21:23:39
  • 6421

springMvc+swfUpload实现异步文件上传(前台用纯html后台返回json)

前台页面: HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> SWFUpload Demos href="css/defau...
  • fengqilove520
  • fengqilove520
  • 2016-11-03 10:08:12
  • 1182

SWFUPLOAD的使用(java版)

很多开发的时候会遇到附加上传功能,最近项目中使用的是uploadswf插件,SWF主要是多文件无刷新上传,利用flash完成多文件上传操作下面把java开发中使用简单的介绍一下:   Jsp页面代...
  • shiyuezhong
  • shiyuezhong
  • 2012-09-06 14:14:10
  • 10046

swfupload+ajax实现多文件上传下载删除并将上传文件上传到数据库

  • 2010年05月16日 00:32
  • 3.28MB
  • 下载
    编程技术学习交流群 :154514123
    微信
    个人资料
    持之以恒
    等级:
    访问量: 65万+
    积分: 8701
    排名: 2808
    最新评论