uploadify上传用的是一个flash插件。
flash中有个bug就是自身创建一个session,这样就导致与web本身的session不一致
导致问题
在进行 权限控制 登录的用户会存储session 导致 session获取不到 上传失败
解决思路
创建监听器存储session信息
在通过uploadify上传时候 存储sessionId
在权限控制中根据sessionId获取原有的session信息
解决方案
1.首先创建一个存储session和获取session和移除session的公共类
java代码:
public class CmsSessionContext {
private static final Map<String,HttpSession> ctx=new HashMap<String, HttpSession>();
private CmsSessionContext (){
}
public static void addSession(HttpSession session){
ctx.put(session.getId(), session);
}
public static void remoceSession(HttpSession session){
ctx.remove(session.getId());
}
public static HttpSession getSession(String sessionId){
return ctx.get(sessionId);
}
}
2.创建session的监听器
/**
* session的监听器为了解决uploadify上传session丢失的问题
* @author Administrator
*
*/
public class CmsSessionListener implements HttpSessionListener {
//创建session
@Override
public void sessionCreated(HttpSessionEvent event) {
}
//关闭浏览器退出session销毁
@Override
public void sessionDestroyed(HttpSessionEvent event) {
CmsSessionContext.remoceSession(event.getSession());
System.out.println("移除了session"+event.getSession().getId());
}
}
在web.xml配置监听器
<!-- 配置获取session的监听器 -->
<listener>
<listener-class>org.cms.web.CmsSessionListener</listener-class>
</listener>
3.在登录成功之后存入session
CmsSessionContext.addSession(session);
System.out.println("存储了session"+session.getId());
4.在上传页面传递sessionId
使用隐藏域存储当前的sessionId
根据 uploadify 的 formData 属性 传递sessionId
html代码:
<input type="hidden" id="sid" value="<%=session.getId()%>"/>
<input type="file" id="attach"name="attach" />
<input type="button" id="uploadFile"value="上传文件" />
$(function() {
$('#attach')
.uploadify(
{
'swf' : $("#ctx").val()
+ '/resources/uploadify/uploadify.swf',
'uploader' : 'upload',
//服务器段访问的名称
'fileObjName' : 'attach',
//限制文件上传类型
'fileTypeExts' : '*.gif; *.jpg; *.png; *.txt',
//不能自动上传
'auto' : false,
'formData':{"sid":$("#sid").val()},
'onUploadSuccess' : function(file, data, response) {
//alert('The file '
// + file.name
// + ' was successfully uploaded with a response of '
// + response + ':' + data);
//字符串转换成json
var ao = $.parseJSON(data);
//alert(ao.result);
}
});
$("#uploadFile").click(function() {
$("#attach").uploadify("upload", "*");
});
});
5.在权限控制的拦截器中 获取sessionId
/**
* 如果使用uploadify进行文件的上传,由于flash的bug问题,会产生一个新的session,此时验证失败
* 所以必须在此处获取一个原有的session,然后重置session信息
*/
//如果是uploadify上传获取sid
String sid=request.getParameter("sid");
if(sid!=null&&!"".equals(sid.trim())){
//当sid有值,就表示是通过uploadify上传文件,此时就应该获取原有的session
session=CmsSessionContext.getSession(sid);
}
6.在退出登录的方法中移除session
public String logout(HttpSession session){
//移除session
CmsSessionContext.addSession(session);
//session失效
session.invalidate();
return "redirect:/login";
}