欢迎来到天天文库
浏览记录
ID:8870920
大小:18.50 KB
页数:4页
时间:2018-04-10
《dwrsessionerror问题的解决办法》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、DWRSessionError问题的解决办法问题情境再现使用的Dwr版本2.0在一台服务器上的不同端口上部署了同样的程序(tomcat5.5.2880端口,tomcat5.5.288080端口)使用浏览器先后登陆80,8080端口的程序,都不注销,保持会话状态。然后浏览器切换到8080的一个使用了DWRajax功能的页面上,浏览器弹出SessionError的提示。但是,如果切换到80端口的程序上,同样进入到一个使用了dwrajax技术的页面上,没有SessionError的提示。问题诊断:初步怀疑浏览器的问题。检查浏览器的cookie中的jsessionid的值。因
2、为我们知道,Http协议本身是无状态的,服务器标识同一次会话的过程就是借助于cookie中的某个值或者通过url重写的方式来实现。这也是jsp程序的session原理。检查发现:cookie中存在2个sessionid项,sessionid的值不同。因为站点地址相同,url也相同(除了端口不同外),因此,浏览器“误”认为是同一个程序,把缓存的cookie项都发送回了服务器。然后再观测ajax请求的值,即httppost或get的参数值如下:callCount=1page=/web/initRolePermission.actionhttpSessionId=3F5F7
3、D7C14D40667FF126DC6F9038EE5scriptSessionId=5B2B53E512648E78C92393E052589CA3859c0-scriptName=adminRolePerActionc0-methodName=findPermissionc0-id=0c0-param0=string:181batchId=0在这里,务必注意httpSessionId=3F5F7D7C14D40667FF126DC6F9038EE5,实际上,一般情况下,httpSessionId和cookie中的jsession值是相同的。至于dwr组件中,为什么
4、要加上httpSessionId,这是因为dwr开发团队考虑到了跨站攻击问题。因此,通过验证dwrajax请求中的httpSessionId值,来防止跨站攻击。在重现,诊断问题过程中,发现SessionError的信息是来自dwrajax请求的响应中,抛出的异常是java.lang.SecurityException,因此可以怀疑这个错误信息是源于dwr源代码中的。用Eclipse打开下载到的dwr源代码。搜索SessionError的信息,然后在org.directwebremoting.dwrp.Batch类中找到了,其部分代码如下:/***Checkthatth
5、isrequestisnotsubjecttoaCSRFattack*@paramrequestTheoriginalbrowser'srequest*@paramsessionCookieName"JSESSIONID"unlessithasbeenoverridden*/privatevoidcheckNotCsrfAttack(HttpServletRequestrequest,StringsessionCookieName){//Achecktoseethatthisisn'tacsrfattack//http://en.wikipedia.org/wiki/
6、Cross-site_request_forgery//http://www.tux.org/~peterw/csrf.txtif(request.isRequestedSessionIdValid()&&request.isRequestedSessionIdFromCookie()){StringheaderSessionId=request.getRequestedSessionId();if(headerSessionId.length()>0){StringbodySessionId=getHttpSessionId();//Normalcase;ifsam
7、esessioncookieissuppliedbyDWRand//inHTTPheaderthenallisokif(headerSessionId.equals(bodySessionId)){return;}//Weblogicaddscreationtimetotheendoftheincoming//sessioncookiestring(evenforrequest.getRequestedSessionId()).//UsetherawcookieinsteadCookie[]cookies=request.getCookies();f
此文档下载收益归作者所有