`

解决SWFUpload上传控件在非IE浏览器下不好用的问题

阅读更多

解决SWFUpload上传控件在非IE浏览器下不好用的问题,主要是两点:一点是请求路径,一点是网上说的session的问题。

 

第一:路径问题

SWFUploa控件的upload_url必须是绝对路径

如我的项目链接为:http://127.0.0.1:8080/TestWeb,进行文件上传的servlet为uploadServlet,那么upload_url就必须为:http://127.0.0.1:8080/TestWeb/uploadServlet

若只是写upload_url:uploadServlet,IE(IE11没试过)能用,非IE的(如谷歌、火狐、360)都是404。

 

第二:sessionid丢失的问题

这个问题如果后台不需要session验证其实也不是什么问题,但是要验证呢就是个问题了

这个问题谷歌不明显,路径问题解决了谷歌浏览器还是可以上传的

火狐彻底不行,原因就是网上说:sessionid丢失了。

所以只需要在文件上传时把sessionid带过来再通过sessionid把原来的session找回来问题就解决了。具体解决如下:

第一步、建立一个全局map用来存放session

public class MySessionContext {     
    private static MySessionContext instance;     
    private HashMap mymap;     
         
    private MySessionContext() {     
        mymap = new HashMap();     
    }     
         
    public static MySessionContext getInstance() {     
        if (instance == null) instance = new MySessionContext();     
        return instance;     
    }     
         
    public synchronized void AddSession(HttpSession session) {     
        if (session != null) mymap.put(session.getId(), session);     
    }     
         
    public synchronized void DelSession(HttpSession session) {     
        if (session != null)mymap.remove(session.getId());     
    }     
         
    public synchronized HttpSession getSession(String session_id) {     
        if (session_id == null) return null;     
        return (HttpSession) mymap.get(session_id);     
    }   
}

 第二步、建一个session监听器,当session创建和销毁的时候map中随之添加删除session

public class MySessionListener implements  HttpSessionListener{
	private MySessionContext myc=MySessionContext.getInstance();  
	
	public void sessionCreated(HttpSessionEvent arg0) {
		myc.AddSession(arg0.getSession()); 
	}

	public void sessionDestroyed(HttpSessionEvent arg0) {
	     myc.DelSession(arg0.getSession());     
	}
}

 在web.xml中注册这个监听器:

<listener>
	<display-name>MySessionListener</display-name>
	<listener-class>com.wjl.MySessionListener</listener-class>
</listener>

第三步、在文件上传路径中把sessionid传过来

var sessionid = '<%=session.getId()%>';
var serverURL='<%=basePath%>';
upload_url: serverURL+'uploadServlet?jsessionid='+sessionid

第四步、在后台需要验证session的时候重新生成session

Object userInfo = request.getSession().getAttribute("userInfo");
if (userInfo == null){
	String sessionID = request.getParameter("jsessionid");
	if(sessionID!=null && sessionID.trim().length()>0 && (!sessionID.trim().equalsIgnoreCase("null"))){//说明session有传值
		HttpSession sess = MySessionContext.getInstance().getSession(sessionID);
		userInfo = sess.getAttribute("userInfo");
    	       if(userInfo==null){
    		     throw new Exception("用户信息获取失败:userInfo=null");
    	        }
	}
}

 这样子之后,用户验证就通过了,自然也就不会空指针,也就能上传文件啦。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics