资源预览内容
第1页 / 共4页
第2页 / 共4页
第3页 / 共4页
第4页 / 共4页
亲,该文档总共4页全部预览完了,如果喜欢就下载吧!
资源描述
DWR Session Error 问题的解决办法问题情境再现问题情境再现使用的 Dwr 版本 2.0在一台服务器上的不同端口上部署了同样的程序(tomcat5.5.28 80 端口,tomcat 5.5.28 8080 端口)使用浏览器先后登陆 80,8080 端口的程序,都不注销,保持会话状态。然后浏览器切换到 8080 的一个使用了 DWR ajax 功能的页面上,浏览器弹出 Session Error 的提示。但是,如果切换到 80 端口的程序上,同样进入到一个使用了 dwr ajax 技术的页面上,没有 Session Error 的提 示。问题诊断:问题诊断:初步怀疑浏览器的问题。检查浏览器的 cookie 中的 jsessionid 的值。因为我们知道,Http 协议本身是无状态的,服务器标识同一次会话的过程就是借助于 cookie 中的某个值或者通过 url 重写的方式来实现。这也是 jsp 程序的 session 原理。检查发现:cookie 中存在 2 个 sessionid 项,sessionid 的值不同。因为站点地址相同,url 也相同(除了端口不同外),因此,浏览器“误”认为是同一个程序,把缓存的 cookie 项都发送回了服务器。然后再观测 ajax 请求的值,即 http post 或 get 的参数值如下:callCount=1page=/web/initRolePermission.actionhttpSessionId=3F5F7D7C14D40667FF126DC6F9038EE5scriptSessionId=5B2B53E512648E78C92393E052589CA3859c0-scriptName=adminRolePerActionc0-methodName=findPermissionc0-id=0c0-param0=string:181batchId=0在这里,务必注意httpSessionId=3F5F7D7C14D40667FF126DC6F9038EE5,实际上,一般情况下,httpSessionId 和 cookie 中的 jsession 值是相同的。至于 dwr 组件中,为什么要加上 httpSessionId,这是因为 dwr 开发团队考虑到了跨站攻击问题。因此,通过验证 dwr ajax 请求中的 httpSessionId 值,来防止跨站攻击。在重现,诊断问题过程中,发现 Session Error 的信息是来自 dwr ajax 请求的响应中,抛出的异常是 java.lang.SecurityException,因此可以怀疑这个错误信息是源于 dwr 源代码中的。用 Eclipse 打开下载到的 dwr 源代码。搜索 Session Error 的信息,然后在org.directwebremoting.dwrp.Batch 类中找到了,其部分代码如下:/* Check that this request is not subject to a CSRF attack* param request The original browsers request* param sessionCookieName “JSESSIONID“ unless it has been overridden*/private void checkNotCsrfAttack(HttpServletRequest request, String sessionCookieName)/ A check to see that this isnt a csrf attack/ http:/en.wikipedia.org/wiki/Cross-site_request_forgery/ http:/www.tux.org/peterw/csrf.txtif (request.isRequestedSessionIdValid() if (headerSessionId.length() 0)String bodySessionId = getHttpSessionId();/ Normal case; if same session cookie is supplied by DWR and/ in HTTP header then all is okif (headerSessionId.equals(bodySessionId)return;/ Weblogic adds creation time to the end of the incoming/ session cookie string (even for request.getRequestedSessionId()./ Use the raw cookie insteadCookie cookies = request.getCookies();for (int i = 0; i 0)String bodySessionId = getHttpSessionId();if(!bodySessionId.startsWith(headerSessionId)throw new SecurityException(“Session Error“);该代码没有考虑到 cookie 中出现多个 jsession 的情况。到此,问题就发现并解决。由于由于 dwrdwr 低版本的低版本的 bugbug 引起的,升级引起的,升级 dwrdwr 版本即解决此问题。版本即解决此问题。可能,读者还有一个疑问:为什么该问题只出现在为什么该问题只出现在 80808080 端口上端口上。检查发现:80 端口的 cookie 项(就是 80 端口产生的 jsessionid 出现在 cookie 项的最前面),这样在 80 端口上的程序访问中,dwr ajax 请求中的 httpSessionId 和 cookie 项最前面的jsessionid 值相同,在 80 端口上,就自然不会出现 session error 错误。
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号