旧人发新贴,请高手指教。  项目环境:服务器采用tomcat需要集群
  项目需求:客户端采用HTTP请求服务器,不是浏览器访问,而是客户端程序。服务器在客户端请求URL的时候,都会创建一个session,且一个用户登录成功后,只使用登录请求的session作为用户信息对象,但是不能把sessionid返回给客户端,由服务器缓存。
  现在问题:
     我在昨天一天的时间实现了apache+tomcat集群,最后还发现jdk统一是影响集群的。当我以为就可以解决的时候,发现问题还是有很多。     1. 客户端在登录成功后,用用户id作为唯一key,在寻找他在登录成功创建的session,那么这个session要存在哪里,集群的话,只共享了session,不能共享我自己的Map对象。  ????     2. 我自己发HTTP请求创建一个MySession(Session),当作是一个map对象,把用户id作为key,value存用户登录成功的session。虽然离我的设想很近了,但是新的问题又出现了,集群的时候,假如2个tomcat,如何保证是自己的MySession是同一个,当其中一台tomcat重启后,怎么获得原来的MySession.???     3. 当我能够在MySession中用用户id找到他对应的session的时候,怎么把session在激活也就是更新最后访问时间。??     4. 我最想的就是能否重写tomcat中StandarMananger创建session的类,这样我自己就能完整的管理session。?   不懂发帖,之有一些想法,请各位赐教了。

解决方案 »

  1.   


    不是,手机客户端登录服务器,无法缓存sessionid、cookie等,所以每次到服务器都会有session产生,而服务器就是要保证同一个用户过来,一值使用一个session作为对象处理。
      

  2.   


    你这个需求有问题,sessionId(或者其它什么唯一的数据来标志)肯定是要返回给客户端的.客户端什么东西都没有,你怎么能确定它是哪个用户?
      

  3.   

    大哥说的好, 但是项目需求,就是有他的难度,我们的客户端有手机,那么手机的消息头中无法存储太大的sessionid,所以只能放弃,而采用登录用户长度在12位之内。
      

  4.   

    一般来说,用户登录后,就会一直用一个tomcat,session不会共享。只是为了数据备份,避免一台机器down掉了系统无法使用,才用的session共享吧。
    即使是手机,应该也是可以获取到session的。
      

  5.   


    这个项目解决方案,还是要从修改手机客户端着手,让这个客户端符合HTTP规范.按你一楼说的需求,是不能实现用户登陆的需求.如果说实现了,一定有问题或者说有漏洞.ps: "手机的消息头中无法存储太大的sessionid",应该不是这样的,无论那个手机的web浏览器都支持这个.....
      

  6.   


       嗯嗯, 现在基本摸清了里面的实现,按照这样的方式确实实现不了。
        所以我找了另外的一种方法,memcached缓存服务器,让tomcat只实现集群,session就不用了,tomcat吧数据都提交到memcached缓存服务器上去,这样给他们相同的key存取就可以了。
       
       至于tomcat集群session,手机是可以带sessionid,原本是想减少流量,通过验证不带sessionid是实现不了的。
       
       谢谢楼上各位的回复,结贴了啊。
      

  7.   


    这个要看你设置集群的方式,一种是绑定型,就是客户端ip第一次访问的是哪个tomcat,后续就只请求一个tomcat,一种是轮训,按照请求顺序一个请求换一个tomcat实现。
    第一可以不需要session共享,但是这样实现的很少。