`
jamesby
  • 浏览: 381049 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

如何防止用户恶意的F5刷新操作的问题?

    博客分类:
  • Java
阅读更多
背景:
  问题是这样的,系统持久层采用ibatis架构,系统有几个比较复杂的报表,耗费时间稍微长,不过在3秒以内.
   但是在报表页面按 F5 10秒钟则会出现statement timeout 的异常,因此有了如何防止用户恶意刷新的想法.

初步想法
   在内存中维护一个类似集合的东西,记录url,userid和访问时间,该集合的数据量维护在一个合理的范围,采用先进先出原则,根据访问时间、url和userid判断用户访问某个url的频繁程度,利用Interceptor从而在用户访问service之前拒绝用户访问!

   谁能提供一个更好的想法?    


分享到:
评论
32 楼 yfmine 2007-05-31  
nihongye 写道
这还不简单.
if(session.getAtrribute("busy") != null)
{
   return "busy"
}
session.setAttribute("busy","")
try{
doProcess();
}finally{
session.removeAttribute("i am busy")
}

好办法,把这段代码搞到拦截器里去...
31 楼 birdjavaeye 2007-05-31  
抛出异常的爱 写道

BufferString是String的父类当有变化时时减少资源浪费
(如果是String那么url+"/xxx.do?"+"zzz=yyy"+"&aaa=bbb"+"&cccc=dddd")

StringBuffer怎么是String的父类了??

另外 url + "asdfa" + "asdfasd" + .... + "asdfas"
和new StringBuffer(url).append("adfasdf").append("asdf").....toString()是一样的
编译器自动把+变成了append
看编译后的bytecode可以证明这一点

但如果是这样:
String s = url + "asdf";
s = s + "asfdasdf";
...
s = s + "sjfdkajsdlfj";
就很浪费,多个StringBuffer,多次toString()
比:
s = url.concat("asdfas").concat("sdfasdf")...还慢
这类情况就要明白写出StringBuilder.append
而前述的 a + b + c ... 连着写没有问题(当然要是在意Builder比Buffer更快,那还是手工写出来)

这里编译器指 sun jdk 1.4+ eclipse 3.0+ 更早版本没验证过
30 楼 nihongye 2007-05-31  
这还不简单.
if(session.getAtrribute("busy") != null)
{
   return "busy"
}
session.setAttribute("busy","")
try{
doProcess();
}finally{
session.removeAttribute("i am busy")
}
29 楼 苏飞 2007-05-31  
我喜欢你们两个的讨论。更倾向于jamesby加上时间限制的想法。
28 楼 sg552 2007-05-31  
楼上的请不要作广告好吗?

我觉得用户频繁访问的问题,为什么不在server端,防火墙端,或者container端进行设置呢?  这个还要自己来写吗?
27 楼 jamesby 2007-03-08  
抛出异常的爱 写道
jamesby 写道
背景:
  问题是这样的,系统持久层采用ibatis架构,系统有几个比较复杂的报表,耗费时间稍微长,不过在3秒以内.
   但是在报表页面按 F5 10秒钟则会出现statement timeout 的异常,因此有了如何防止用户恶意刷新的想法.

初步想法
   在内存中维护一个类似集合的东西,记录url,userid和访问时间,该集合的数据量维护在一个合理的范围,采用先进先出原则,根据访问时间、url和userid判断用户访问某个url的频繁程度,利用Interceptor从而在用户访问service之前拒绝用户访问!

   谁能提供一个更好的想法?    



一时想起来你说的是F5
MS在提交时不用submit按钮
而是用javascript触发
就没这问题了

function TheFormSubmit(){
form.action="makePrintPage";
form.submit();
}


我遇到的客户要求与楼主不一样


PS:楼上没事的只是惊讶于你对我们客户的了解之深....
这个倒是可以,不过可能照正常的做法多出了几个form出来.另外问个问题?
PS是什么意思?
26 楼 抛出异常的爱 2007-03-07  
jamesby 写道
背景:
  问题是这样的,系统持久层采用ibatis架构,系统有几个比较复杂的报表,耗费时间稍微长,不过在3秒以内.
   但是在报表页面按 F5 10秒钟则会出现statement timeout 的异常,因此有了如何防止用户恶意刷新的想法.

初步想法
   在内存中维护一个类似集合的东西,记录url,userid和访问时间,该集合的数据量维护在一个合理的范围,采用先进先出原则,根据访问时间、url和userid判断用户访问某个url的频繁程度,利用Interceptor从而在用户访问service之前拒绝用户访问!

   谁能提供一个更好的想法?    



一时想起来你说的是F5
MS在提交时不用submit按钮
而是用javascript触发
就没这问题了

function TheFormSubmit(){
form.action="makePrintPage";
form.submit();
}


我遇到的客户要求与楼主不一样


PS:楼上没事的只是惊讶于你对我们客户的了解之深....
25 楼 magic_seek 2007-03-01  
<br/>
<strong>抛出异常的爱 写道:</strong><br/>
<div class='quote_div'><br/>
<div class='quote_div'>
<p>你是我那个项目的客户吧<br/>
这些要求都给你实现了</p>
<p><img src='/javascripts/fckeditor/editor/images/smiley/msn/omg_smile.gif' alt=''/>我是一个程序员,一个java程序员。<br/>
<br/>
</p>
</div>
</div>
<br/>
<br/>
<br/>
<br/>
24 楼 8844.43 2007-02-28  
jamesby 写道
说到synchronized突然产生了一个想法,controller的代码写成如下这样大家看如何?

public ModuleAndView handleReport(....)
{
    synchronized(session.getAttribute("user"))
    {
        //产生报表
    }
}


使用synchronize肯定会有性能上的问题.即使要用是否也应该这样?
public ModuleAndView handleReport(....)
{
    synchronized(session)
    {
        if (session.getAttribute("URL_NAME") != null)
        {
            //错误处理.
        }

        session.setAttribute("URL_NAME", new Object());
    }
    //产生报表

    synchronized(session)
    {
        session.removeAtrribute("URL_NAME");
    }
}


这个问题如果是单机环境,把用户访问的时间戳存到Session中,然后做时间比较应该是最简单的.
如果是集群应用环境,还要考虑各机器之间的Session同步开销问题,需要综合权衡.
23 楼 叶子 2007-02-28  
这个...apache/iis相关组件就能解决了吧....何必要java层去搞...
22 楼 basicbest 2007-02-28  
你们压力测试怎么做的呢?F5就挂掉有些小小夸张了。

另外,如果同时在线人数少,cache可以用session做,如果在线人数多,就要用到其他机制了。
21 楼 jamesby 2007-02-28  
yiding_he 写道
我觉得这个问题应该放到 Filter 中解决,session 中放一个 HashMap 记录页面 url (去掉“?”之后的内容)和访问时间,用户访问时做一下判断。
恩也可以,其实这反映的程序是否足够健壮,当然如果用户都是比较温和的,则这种考虑是多余的。

感觉这也像是防止系统用户进行Dos攻击:)
20 楼 yiding_he 2007-02-28  
我觉得这个问题应该放到 Filter 中解决,session 中放一个 HashMap 记录页面 url (去掉“?”之后的内容)和访问时间,用户访问时做一下判断。
19 楼 抛出异常的爱 2007-02-27  
<br/>
<strong>magic_seek 写道:</strong><br/>
<div class='quote_div'>
<p><font>看了这么多回复好像还没有人讲到F5刷屏造成出现异常的本质原因,我这里就说一下吧,虽然也不一定就对。</font></p>
<p><font>Http的请求处理和数据库的处理都是有能力限制的,当用户不断的f5刷屏后,系统就接受了多次Http请求,因为每个请求的处理时间都比较长,所有占用的大量的资源,尤其是数据库的资源,当用户刷屏达到一定次数后达到了数据库的处理能力极限,这样后面的请求就会超时报错。</font></p>
<p>解决这样的问题可以从两个方面来考虑,增加系统处理能力(比如缓存)或者降低资源占用(不要重复执行业务),实现的具体形式是可以有多种多样的,不过需要注意的是用户刷屏后浏览器的前一次请求在浏览器端可能被放弃了,即就算服务器程序返回了结果浏览器可能也不会处理,这时浏览器可能只会处理最后一次访问的结果,所以如果想要用户放弃刷屏最好以最快的速度返回给他一个页面,告诉他不要刷屏了。</p>
<p>但在客户是上帝的今天,告诉他不要刷屏估计也有点不合适,所以在客户端直接屏蔽F5也不妨是一个好办法。</p>
</div>
<br/>
你是我那个项目的客户吧<br/>
这些要求都给你实现了<br/>
<br/>
18 楼 magic_seek 2007-02-27  
<p><font>看了这么多回复好像还没有人讲到F5刷屏造成出现异常的本质原因,我这里就说一下吧,虽然也不一定就对。</font></p>
<p><font>Http的请求处理和数据库的处理都是有能力限制的,当用户不断的f5刷屏后,系统就接受了多次Http请求,因为每个请求的处理时间都比较长,所有占用的大量的资源,尤其是数据库的资源,当用户刷屏达到一定次数后达到了数据库的处理能力极限,这样后面的请求就会超时报错。</font></p>
<p>解决这样的问题可以从两个方面来考虑,增加系统处理能力(比如缓存)或者降低资源占用(不要重复执行业务),实现的具体形式是可以有多种多样的,不过需要注意的是用户刷屏后浏览器的前一次请求在浏览器端可能被放弃了,即就算服务器程序返回了结果浏览器可能也不会处理,这时浏览器可能只会处理最后一次访问的结果,所以如果想要用户放弃刷屏最好以最快的速度返回给他一个页面,告诉他不要刷屏了。</p>
<p>但在客户是上帝的今天,告诉他不要刷屏估计也有点不合适,所以在客户端直接屏蔽F5也不妨是一个好办法。</p>
17 楼 抛出异常的爱 2007-02-27  
newman 写道
屏蔽f5,加什么控制,这些都是“标”,程序员这么处理问题是够失败的,应该把查询的实现机制重新做个考虑,让其不成为问题,而不是有了问题去“补”。一孔之见,不要见怪。

有个东西叫报表软件
是公司花了N大元买来的
如果想要治本让他们把源码拿来我把lessonees关了明年就可以不用付钱了
16 楼 newman 2007-02-27  
屏蔽f5,加什么控制,这些都是“标”,程序员这么处理问题是够失败的,应该把查询的实现机制重新做个考虑,让其不成为问题,而不是有了问题去“补”。一孔之见,不要见怪。
15 楼 抛出异常的爱 2007-02-26  
chpn 写道
还应先在浏览器中做第一次保护 屏蔽F5 Crl+R

我遇到的是用鼠标点了N回
但是由于报表天生就慢
他就怎么也出不来
点了5分钟把机器玩的差点当了

所以要加缓存
是让他们点了N次之后不用再去数据库里查寻
也能得出结果否则他一看出了结果之后一激动点了其它的的连接回不来了...
当时的查询如果不加条件大约要用2分钟左右.
14 楼 chpn 2007-02-26  
还应先在浏览器中做第一次保护 屏蔽F5 Crl+R
13 楼 抛出异常的爱 2007-02-26  
jamesby 写道
抛出异常的爱 写道
你的测试如何写啊?(现在比较关心这种特例的测试写法)
这个没有考虑过,哪位给点经验?
大约是要开多个线程来测试的吧?如何来作我也没作过正在想怎么作呢

相关推荐

Global site tag (gtag.js) - Google Analytics