关于DWR 2.0的Reverse Ajax特性的一个问题
DWR 2.0的Reverse Ajax功能确实非常强大,但是目前还是有一些问题,不知是我程序的问题,还是确实是BUG。
发现问题:在服务器端java代码中需要用到HttpSession存取变量,但是用一个扩展了HttpSessionListener的监听器发现,每次打开一个新的IE窗口第一次调用已经写好的服务器方的方法存取一个HttpSession中的变量,就会创建2个HttpSession。这样有时会导致后面的程序有一定几率取到不同的HttpSession而找不到原已经存好的变量。
通过跟踪源码,发现在dwr的包中的org.directwebremoting.dwrp.PollHandler的notifyThreadsFromSameBrowser(HttpServletRequest request, String scriptId)使用过HttpSession,在自己写的程序里面也同样使用了HttpSession,这样同一个连接就有了2个不同的HttpSession,但是不对呀,同一个进程的浏览器怎么会在服务器端创建2个不同的Session呢?
再次跟踪源码,发现在页面上加入dwr.engine.setActiveReverseAjax(true);这个js代码后,页面会定期访问<myApp>/dwr/call/plainpoll/ReverseAjax.dwr 60秒一次,在页面第一次调用服务器方的方法的时候也会访问<myApp>/dwr/call/plainpoll/<类名>.<方法名>.dwr,而这2个连接使用的是不同jsessionId,这样直接导致服务器方在使用HttpSession的时候创建了2个不同Session。
这样一个连接多个httpSession无疑是一种资源的浪费,而且在程序接下来的处理过程中使用有可能一下用这个Session,一下用那个Session,导致程序出错,不知道怎么解决这个问题。