最近兄弟项目组的一个企业内部系统, 客户发神经, 要解决以下几个技术问题:
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_4c78bbcc0100groa.html