锁定老帖子 主题:限制多窗口重复登陆
精华帖 (9) :: 良好帖 (2) :: 新手帖 (11) :: 隐藏帖 (1)
|
|
---|---|
作者 | 正文 |
发表时间:2009-12-24
最后修改:2009-12-26
现在要求系统防止用户短时间内多次发起同一请求给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出来 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-12-24
最后修改:2009-12-24
我认为的一个方法
不用去固定cookie的sessionid因为这也会给某些不怀好意者来搞破坏。 我想:是不是可以在session来锁定。当一个新的session建立时(也可以是登录时),来查看之前所有的session,查看正在登录的用户是否已经登录。如果没有,则让其登录,并把登录的时间 记录到session里面。如果用户已经登录,从之前登录的用户session里面,提取出他登录的时间,如果在你所规定 的时间内(5分钟)就禁止其登录,否则,就销毁之前的session,使用户登录(如果有必要的话,此时可以把旧session里的内容先拷贝的新的session中后,再销毁) |
|
返回顶楼 | |
发表时间:2009-12-24
楼上兄弟,如果能找到之前的SESSION我还在这烦个什么劲呢
我现在的解决方案是用JS做中间层。一方面从本地拿SESSION ID,通过判断当前登录用户做成新的session id放到request中,另一方面从response中取SESSION ID,作为一个common attribute放到cookie中 |
|
返回顶楼 | |
发表时间:2009-12-25
可以给用户表加一个lastLoginTime,用来记录最后一次登录的时间
如果想做到一个帐号同一时间只能允许一个用户使用, 可以用户在第一次登录时将sessionId和customerId记录到application范围中。 其他用户在用户尚未注销的时候再次登录时将会提示用户已经登录,禁止用户再次登录系统(也或者可以将已经登录的人T掉) 然后用户注销或者session超时的时候势必会销毁session,此时你只要实现了HttpSessionListener接口就能监听得到此事件,销毁session的时候将标记从application范围移除即可 |
|
返回顶楼 | |
发表时间:2009-12-25
仍然没有解决如果关掉浏览器新开一个,新的Session问题啊
另外,我也不确定多台web服务器集群的话是否会共享ApplicaitonContext |
|
返回顶楼 | |
发表时间:2009-12-25
不知道为什么我看到那个青虫,就想上去踢几脚!..抱歉. 我也不知道为什么.
|
|
返回顶楼 | |
发表时间:2009-12-25
这有什么好解释的呢?
无论是多开浏览器,或者是别的什么操作。 我们只判断当前用户的最后登录时间和离开时间。 有个时间差值就行了啊? |
|
返回顶楼 | |
发表时间:2009-12-25
验证IP地址不行吗?或者MAC地址
|
|
返回顶楼 | |
发表时间:2009-12-25
用四层交换机,有个session保持功能,我们就是这么做的
|
|
返回顶楼 | |
发表时间:2009-12-25
最后修改:2009-12-25
lyy3323 写道 这有什么好解释的呢?
无论是多开浏览器,或者是别的什么操作。 我们只判断当前用户的最后登录时间和离开时间。 有个时间差值就行了啊? 我的意思是,如果跨浏览器,服务器端就不能判断是否是同一个用户,因此不能通过在Session中存放上一次请求时间来达到控制的目的 yonglin4605 写道 验证IP地址不行吗?或者MAC地址
这样会导致一台pc只能限制一个用户登陆使用,这显然是不能说服客户的 |
|
返回顶楼 | |