日期:2014-05-16  浏览次数:20448 次

最近遇到的IE8 jsessionID共有, 手入url check, Mysql Conn Pool TimeOut的问题

          最近兄弟项目组的一个企业内部系统, 客户发神经, 要解决以下几个技术问题:


          1. IE8 中打开多个浏览器,会共用同一个 临时cookie(jsessionid) ,因此第一个窗口中用A帐户login之后, 第二个窗口中用B帐户login,然后再回头刷新第一个窗口,就变成了B帐户

                      具体参见如下

               http://blog.csdn.net/nanjingjiangbiao/article/details/6982778


                 解决方法: 服务器端维持一个hashList , key是用户ID,  value是当前用户的jsessonID。 具体修改代码两个地方, 一个是所用的MVC框架的serlvet(或者filter)

           第二个地方是修改MVC框架中 setSession的API


          2.  手动拼url访问

                 项目中已经做到了没有login成功的jsessonid,不能访问url (serlvet中实现)

           但是客户要求,就算login成功之后,也只能一步步的访问画面,走数据流程,不能中间直接手入力url

                解决方法: 服务器端做后台token。 每个画面都对应一个特殊的token, 存放在session中, 每次进一个新画面的时候, 先从session中拿到前一个画面的token, 拿得到才可以访问。具体代码修改MVC框架中的BaseAction, 在其中维护一个画面迁移token的列表, 在serlvet(filter)上,用反射check住token


             3.  MySql中超过8小时不用的conn会被关掉, Tomcat中的conn pool以为没有关闭, 再调用, 就会出错。

                 解决方法:  网上很多人说改mysql里面的超时时间,改成最大, 这招太暴力, 数据库废弃的conn太多,会有危险

                最好的方法, 修改conn pool 的配置。 比如用tomcat的连接池, 可以配置 每隔一段时间发起一次sql,查询该connection的死活。

               追记: 这个问题本质上的原因是JDBC连接Mysql用的是持久化connection,也就是说就算你con pool里面设了超时时间,过了这段时间再去连mysql, 它也会把上次建立好的conn 返回给你, 这样就累计到8小时导致你出错。

                mysql官方给出的方法如下:

                  http://bugs.mysql.com/bug.php?id=5020

               mysql持久化conn和暂时conn的区别:

                 http://blog.sina.com.cn/s/blog_4c7