一个点击打印产生新jsessionid的问题

需求描述

最近在解决问题时,又发现了一个打印时产生新jsessionid,其session不再是原来页面的session,在IE下原来的session就获取不到了,反应到用户那里就是需要用户重新登录。这个问题跟RBP-61605文章现象很类似,但是环境不一样。

环境:

tomcat6tomcat7jdk1.6j2ee应用,一个applet运行在浏览器中,网站有验证机制

分析:

  1. 查看appletjava控制台:在tomcat6下请求jar时会自动带上JSESSIONID,而在tomcat7中不会导致通不过验证机制
  2. 打开wireshark监控通讯,发现,tomcat7下设置cookie为:比tomcat6下多了个HttpOnly

Js代码

Set-Cookie: JSESSIONID=B7587AE3765290179B8CE4027545391F; Path=/cems2; HttpOnly
  1. 看来就是因为这个导致applet获取浏览器的cookie值时,被浏览器拒绝了

解决:

  1. 设置应用禁止HttpOnly或身份标识Cookie创建时创建禁止CookieuseHttpOnly=false即可
    然后安全性自己控制:如cookie加密等

Xml代码

<?xml version="1.0" encoding="UTF-8" ?>
<Context path="/${tomcat.deployName}" docBase="${basedir}/WebRoot" useHttpOnly="false"/>
  1. 数字签名不可行,注意applet plugin jvm初始化时,就会去网站检查jar,实际上这个时候还只是jvm plugin load class——我们无法控制,所以也无法动作
  2. jar的访问不验证,签名jar,然后在applet启动时,强制读取cookie(通过签名了),存储cookieapplet环境中——被证明依然不可行,官方好像说jdk1.6u16就解决了这个问题,不过貌似我这里不行ubuntu 10.10 ffchrome都测试了,试想如果真的可以,那么任何plugin也可以读取,安全性又回到了httponly=false的情形了。
  3. 主动发送cookie,通过在页面设置cookie做为paramters传递给plugin,然后所有访问服务器资源的连接都主动设置此cookie即可,经过验证是可行的。
  4. 权衡14,还是采用方法1最快最容易实施
  5. 或启用useHttpOnly=true然后,用户登录后设置cookie[appletkey][HttpOnly=false],所有applet的访问验证都通过appletkey cookie值进行

总结:

故在tomcat7.0下的context.xml里设置useHttpOnly=”false”

热门文章