论坛首页 Java企业应用论坛

限制多窗口重复登陆

浏览 23571 次
精华帖 (9) :: 良好帖 (2) :: 新手帖 (11) :: 隐藏帖 (1)
作者 正文
   发表时间:2009-12-24   最后修改:2009-12-26
我们都知道WEB服务器通过识别客户请求中的session id来判断是否返回新的HttpSession,一般情况下这个session ID是保存在客户端cookie中,准确的说是保存在session cookie中。 也就是说一旦关闭浏览器,此session cookie消失,保存其中的session ID也随之消失。再新建的浏览器再次发起请求时,服务器端找不到对应的session ID就会新建一个HttpSession返回给客户。


      现在要求系统防止用户短时间内多次发起同一请求给APP造成业务处理压力,于是在用户登陆后第一次发起此请求时记录当前时间保存到Session中,并且在下次发起相同请求时从Session中去除上次请求时间计算时间差,小于5min时给出提示并驳回请求。但是因为存在上述的问题,聪明(还是狡猾的?)客户利用多次开关浏览器便可以突破这个限制。我现在在想是否能将session ID保存到客户端硬盘的cookie上,即cookie.setMaxAge(N); N>0的方法。但是貌似session ID不能保存到持久化cookie上,不知道各位有没有什么办法?


      另外,如果能顺利地将session ID保存到持久化cookie上,会出现另外一个问题。不同用户在同一台pc上登陆系统,却发送相同的session ID给服务器,显然不对。因此,得让存在持久化cookie上的session ID根据系统登陆用户不同而不同,这需要在把cookie放到HTTP HEAD之前,拿到session ID并根据当前登陆用户做处理。不过对cookie的处理是在服务器端执行reqeust.getSession()的时候直接去cookie中的JSESSIONID属性,我怎么

才能让cookie中保存多个JSESSIONID呢


      顺便提一下,我们生产环境上4台WEB SERVER,配置了Session共享和session粘性,即对客户来说,就跟只有一台WEB一样。另外,我们有SSO,但是cookie.setMaxAge(-1);于是跨浏览器的话Session又是新的了

case0079 写道
URL REWRITE

URL REWRITE前提是服务器端给返回一个JSESSIONID,但如果客户端给过去的jsessionid每次都不同,如何指望返回来的东东的正确性呢。
同上,棘手的不是server side,而是client side

凤舞凰扬 写道
引用
好像服务器就是根据session id来判断是否是同一个用户的,如果是一有的seesion id,则会将请求分流到之前处理这个请求的节点上。现在的问题是session id在每次IE关掉之后在客户端都没有了,服务器没办法进行识别。
不知道我的理解是否正确

   我们常说的session id是服务器判断与之相连接的客户端的会话,实质上,和我们另外一个角度理解的用户是有区别的。你说的没错,如果已经存在session,就转发。不过后面一句就陷进去了。其实我前面说过,你需要传递另外一个东西,jsessionId,你在很多网站都可以看到这种应用(尤其是IBM的),对于转发服务器来说,是否存在http session并不重要,没有创建一个就是。你session中存储的数据并不在其中,而是在你对应的JVM节点中,而它是可以通过jsessionId这样的方式去获取的。
   至于说怎么识别这样的东西,其实所有的支持负载均衡多个JVM节点并存的服务器都支持。或者大不了如楼上所说,自己建立中央缓存,自己在程序中识别这样的request参数。


大概明白您的意思了。即把session id存放在JVM SESSION中而非HTTP SESSION中,跟之前那位兄弟提到的memcache方案基本相似。但关键是,这个seesion id在第一次被HttpSession返回来后,如果想在下次发起请求是将其原样送给服务器,就必须有一个机制在客户端能让其存活下来,而以浏览器为单位的session cookie是做不到的。

也就是说,问题的关键不是服务器端没办法识别jsessionid,而是这个jsessionid在客户端没法持久化。除非...我能通过在客户端JS上自己动手伪造一个跟登录客户ID相关的jsessionid出来

   发表时间:2009-12-24   最后修改:2009-12-24
我认为的一个方法

不用去固定cookie的sessionid因为这也会给某些不怀好意者来搞破坏。

我想:是不是可以在session来锁定。当一个新的session建立时(也可以是登录时),来查看之前所有的session,查看正在登录的用户是否已经登录。如果没有,则让其登录,并把登录的时间 记录到session里面。如果用户已经登录,从之前登录的用户session里面,提取出他登录的时间,如果在你所规定 的时间内(5分钟)就禁止其登录,否则,就销毁之前的session,使用户登录(如果有必要的话,此时可以把旧session里的内容先拷贝的新的session中后,再销毁)
0 请登录后投票
   发表时间:2009-12-24  
楼上兄弟,如果能找到之前的SESSION我还在这烦个什么劲呢
我现在的解决方案是用JS做中间层。一方面从本地拿SESSION ID,通过判断当前登录用户做成新的session id放到request中,另一方面从response中取SESSION ID,作为一个common attribute放到cookie中
0 请登录后投票
   发表时间:2009-12-25  
可以给用户表加一个lastLoginTime,用来记录最后一次登录的时间
如果想做到一个帐号同一时间只能允许一个用户使用,
可以用户在第一次登录时将sessionId和customerId记录到application范围中。
其他用户在用户尚未注销的时候再次登录时将会提示用户已经登录,禁止用户再次登录系统(也或者可以将已经登录的人T掉)

然后用户注销或者session超时的时候势必会销毁session,此时你只要实现了HttpSessionListener接口就能监听得到此事件,销毁session的时候将标记从application范围移除即可
0 请登录后投票
   发表时间:2009-12-25  
仍然没有解决如果关掉浏览器新开一个,新的Session问题啊
另外,我也不确定多台web服务器集群的话是否会共享ApplicaitonContext
0 请登录后投票
   发表时间:2009-12-25  
不知道为什么我看到那个青虫,就想上去踢几脚!..抱歉. 我也不知道为什么.
1 请登录后投票
   发表时间:2009-12-25  
这有什么好解释的呢?
无论是多开浏览器,或者是别的什么操作。
我们只判断当前用户的最后登录时间和离开时间。
有个时间差值就行了啊?
0 请登录后投票
   发表时间:2009-12-25  
验证IP地址不行吗?或者MAC地址
0 请登录后投票
   发表时间:2009-12-25  
用四层交换机,有个session保持功能,我们就是这么做的
0 请登录后投票
   发表时间:2009-12-25   最后修改:2009-12-25
lyy3323 写道
这有什么好解释的呢?
无论是多开浏览器,或者是别的什么操作。
我们只判断当前用户的最后登录时间和离开时间。
有个时间差值就行了啊?

我的意思是,如果跨浏览器,服务器端就不能判断是否是同一个用户,因此不能通过在Session中存放上一次请求时间来达到控制的目的

yonglin4605 写道
验证IP地址不行吗?或者MAC地址

这样会导致一台pc只能限制一个用户登陆使用,这显然是不能说服客户的
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics