dwr session error-程序员宅基地

http://blog.sina.com.cn/s/blog_5f044a4d010185pn.html
在使用dwr的时候遇到了session error 错误解决方法,就是在web.xml 中配置如下:
<!-- DWR servlet,生产环境应该Debug为false -->
<servlet>
   <servlet-name>dwr-invoker</servlet-name>
   <servlet-class>
    org.directwebremoting.servlet.DwrServlet
   </servlet-class>
   <init-param>
    <param-name>debug</param-name>
    <param-value>true</param-value>
   </init-param>
   <init-param>
    <param-name>logLevel</param-name>
    <param-value>warn</param-value>
   </init-param>
   <init-param>
    <param-name>crossDomainSessionSecurity</param-name>
    <param-value>false</param-value>
   </init-param>
   <load-on-startup>1</load-on-startup>
</servlet>
当中的那个 
<init-param>
    <param-name>crossDomainSessionSecurity</param-name>
    <param-value>false</param-value>
   </init-param>


是为处理这个问题而加入的,经验证的确好用。

这是同源策略的问题,为了WEB环境的安全,在WEB脚本语言中不允许读取不同源的数据,同源包括相同协议,相同域名和相同端口三个条件,可以看这里:
http://www.ynutx.net/raindesign/blog/archive/209.html
而Ajax的异步处理方式跳过了这个限制,为了安全限制,它设置为sameDomainAccess,
这里有些突破这种限制的方式:http://tech.it168.com/j/2007-07-19/200707191542718_1.shtml
以上是自己的理解,不当之处请指正....!

 

 

另外装载了一篇

使用的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=1

page=/web/initRolePermission.action

httpSessionId=3F5F7D7C14D40667FF126DC6F9038EE5

scriptSessionId=5B2B53E512648E78C92393E052589CA3859

c0-scriptName=adminRolePerAction

c0-methodName=findPermission

c0-id=0

c0-param0=string:181

batchId=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 类中找到了,其部分代码如下:

private void checkNotCsrfAttack(HttpServletRequest request, String sessionCookieName)

{

// A check to see that this isn't a csrf attack

// http://en.wikipedia.org/wiki/Cross-site_request_forgery

// http://www.tux.org/~peterw/csrf.txt

if (request.isRequestedSessionIdValid() && request.isRequestedSessionIdFromCookie())

{

String headerSessionId = request.getRequestedSessionId();

if (headerSessionId.length() > 0)

{

String bodySessionId = getHttpSessionId();

// Normal case; if same session cookie is supplied by DWR and

// in HTTP header then all is ok

if (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 instead

Cookie[] cookies = request.getCookies();

for (int i = 0; i < cookies.length; i++)

{

Cookie cookie = cookies[i];

if (cookie.getName().equals(sessionCookieName) &&

cookie.getValue().equals(bodySessionId))

{

return;

}

}

// Otherwise error

log.error("A request has been denied as a potential CSRF attack.");

throw new SecurityException("Session Error");

}

}

}

仔细分析这段代码,即使在上述问题情境环境中,也不会出现Session Error的错误。

然后反编译正在使用的dwr类文件,找到batch类,代码却不同,代码如下:

private void checkNotCsrfAttack(HttpServletRequest request)

{

if(request.isRequestedSessionIdValid() && request.isRequestedSessionIdFromCookie())

{

String headerSessionId = request.getRequestedSessionId();

if(headerSessionId.length() > 0)

{

String bodySessionId = getHttpSessionId();

if(!bodySessionId.startsWith(headerSessionId))

throw new SecurityException("Session Error");

}

}

}

该代码没有考虑到cookie中出现多个jsession的情况。

到此,问题就发现并解决。

 由于dwr低版本的bug引起的,升级dwr版本即解决此问题。

可能,读者还有一个疑问:为什么该问题只出现在8080端口上。

检查发现:80端口的cookie项(就是80端口产生的jsessionid出现在cookie项的最前面),

这样在80端口上的程序访问中,dwr ajax请求中的httpSessionId和cookie项最前面的jsessionid值相同,在80端口上,就自然不会出现session error错误。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qingfengxia2013/article/details/82188923

智能推荐

yum安装及配置_安装yum-程序员宅基地

文章浏览阅读10w+次,点赞40次,收藏332次。yum是用来管理rpm的,就跟maven管理jar包相似。yum源(库)分为本地库、网络库。首先要配置yum源,可支持多个源。先查看一下挂载情况:df -h这里我们要更换光盘,并挂载:mount /dev/cdrom /mnt(如果不能成功挂载,点击一下连接即可)之后再次使用 df -h命令,就能查看到光盘的内容。下面我们cd到 /mnt下查看一下:首先关注一下Pa..._安装yum

关于STM32 CAN的过滤器/滤波器_stm32can mailbox filter-程序员宅基地

文章浏览阅读3.8k次,点赞5次,收藏12次。1.在设置CanTxMsg.StdId时注意需要将其右移一位,比如如下滤波器配置:CAN_FilterInitStructure.CAN_FilterNumber=0;CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;CAN_FilterInitStructure.CAN_FilterScale=CAN_Filter..._stm32can mailbox filter

HDU 5119 Happy Matt Friends(动态规划)【状压基础类模板】_matt has n friends. they are playing a game togeth-程序员宅基地

文章浏览阅读373次。att has N friends. They are playing a game together. Each of Matt’s friends has a magic number. In the game, Matt selects some (could be zero) of his friends. If the xor (exclusive-or) sum of the selected friends’magic numbers is no less than M , Matt wi_matt has n friends. they are playing a game together.

vue3+vite+ts项目配置开发环境和生产环境 打包命令配置_vite打包配置-程序员宅基地

文章浏览阅读8.4k次,点赞6次,收藏29次。开发环境和生产环境的配置和打包方式有所不同,下面是基于vue3+vite+ts项目的开发环境和生产环境配置及打包方式的详细说明。打包完成后会在项目根目录下生成dist目录,里面包含了打包后的静态文件和index.html文件,可以直接部署到服务器上。这里配置了三个命令,分别是开发环境启动命令、开发环境打包命令和生产环境打包命令。1.3 配置.env.development。2.2 配置.env.production。1.2 配置vite.config.ts。2.1 配置vite.config.ts。_vite打包配置

(最新最详细)安装ubuntu18.04-程序员宅基地

文章浏览阅读2w次,点赞4次,收藏91次。目录1. window10中下载ubuntu镜像2. 制作U盘启动盘3. Ubuntu 分配硬盘空间1. window10中下载ubuntu镜像下载地址2. 制作U盘启动盘安装制作工具:UltraISO(点我下载),下载完成后安装插入用来做启动盘的U盘(最好是usb3.0接口,16GB或以上),并清空里面的文件打开安装好的UltraISO,点击继续试用按钮工作界面进入工作界面后,点击菜单栏文件(F),在弹出的选项卡里点击打开在弹出的文件选择对话框中找到下载好的 Ubuntu18.04._ubuntu18.04

Toad报“No valid Oracle Client found”错-程序员宅基地

文章浏览阅读203次。2019独角兽企业重金招聘Python工程师标准>>> ..._toad no valid oracle client

随便推点

Ik分词器配置远程扩展字典_ik analyzer 扩展词典配置远程词典 可实时编辑-程序员宅基地

文章浏览阅读2k次。通过配置远程扩展词典,可以读取远程词典,当改变远程词典时,不必重启服务器,elasticsearch会自动加载并进行分词。步骤:配置文件服务器,把远程扩展词典放到服务器下。修改elasticsearch目录下plugins\ik\config\IKAnalyzer.cfg.xml文件并保存,如下: <properties> <comment>IK A..._ik analyzer 扩展词典配置远程词典 可实时编辑

分布式系列教程(11) -分布式协调工具Zookeeper(分布式锁实现)_分布式锁 的具体实现工具-程序员宅基地

文章浏览阅读553次,点赞2次,收藏2次。代码已提交至Github,有兴趣的同学可以下载来看看(git版本号:bea4d6f7ec9f7309033bcfa43316a660171ae5b6):https://github.com/ylw-github/Zookeeper-Demo本文目录结构:l____1. 知识点回顾l________1.1 多线程l________1.2 Java共享内存模型l____2. 分布式锁的解决方..._分布式锁 的具体实现工具

Nginx网站服务详解(Nginx服务的主配置文件 ——nginx.conf)-程序员宅基地

文章浏览阅读9.3k次,点赞9次,收藏51次。Nginx网站服务详解,Nginx服务的主配置文件,修改,监听,配置,密码认证,以及IP和端口虚拟主机配置方法,含图文步骤拆解讲解_nginx.conf

Java并发——Synchronized关键字和锁升级,详细分析偏向锁和轻量级锁的升级_3.轻量级锁-程序员宅基地

文章浏览阅读10w+次,点赞266次,收藏1.1k次。目录一、Synchronized使用场景二、Synchronized实现原理三、锁的优化1、锁升级2、锁粗化3、锁消除一、Synchronized使用场景Synchronized是一个同步关键字,在某些多线程场景下,如果不进行同步会导致数据不安全,而Synchronized关键字就是用于代码同步。什么情况下会数据不安全呢,要满足两个条件:一是数据共享(临界资源),二..._3.轻量级锁

排序算法-堆积树排序法(HeapSort)-程序员宅基地

文章浏览阅读731次。堆积树排序法是选择排序法的改进版,可以减少在选择排序法中的比较次数,进而减少排序时间。堆积排序法用到了二叉树的技巧,是利用堆积树来完成排序的。堆积树是一种特殊的二叉树,可分为最大堆积树和最小堆积树两种。

Hadoop调优第一篇_hadoop_namenode_opts-程序员宅基地

文章浏览阅读917次。1.hdfs核心参数——回收站设置第一步,在调优前我们需要对namenode与datanode的内存配置进行参数化设置。通过hadoop-env.sh查看namenode与datdanode的具体参数。相关参数设置如下export HDFS_NAMENODE_OPTS=”-Dhadoop.security.logger=INFO,RFAS -Xmx1024m”export HDFS_DATANODE_OPTS=”-Dhadoop.security.logger=ERROR,RFAS -Xmx10_hadoop_namenode_opts

推荐文章

热门文章

相关标签