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

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";
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值