uploadify上传导致session丢失解决方案

来源:互联网 发布:四川广电网络怎么缴费 编辑:程序博客网 时间:2024/05/17 12:19

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";    }
0 0
原创粉丝点击