`
jamesby
  • 浏览: 383410 次
  • 性别: 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 写道
抛出异常的爱 写道
你的测试如何写啊?(现在比较关心这种特例的测试写法)
这个没有考虑过,哪位给点经验?
大约是要开多个线程来测试的吧?如何来作我也没作过正在想怎么作呢

相关推荐

    防止恶意刷新

    // 阻止F5刷新、Ctrl+R刷新 if ((event.keyCode == 116) || (event.ctrlKey && event.keyCode == 82)) { event.keyCode = 0; event.returnValue = false; } } ()"&gt; ``` 此外,代码还包含了其他一些扩展功能...

    禁止浏览器刷新和鼠标刷新还有键盘刷新

    需要注意的是,过于限制用户的操作可能会影响用户体验,并且可能会被恶意用户利用。例如,禁用F5刷新可能导致用户在页面加载错误时无法刷新页面。此外,浏览器的安全策略可能会阻止某些禁用行为,尤其是涉及用户...

    刷新是不可能刷新的这辈子不可能刷新的

    但问题在于,当用户尝试通过JavaScript禁用或改变这个行为时,浏览器通常会出于安全考虑不允许这样做,因为这可能被恶意代码利用。 在JavaScript中,我们不能完全阻止用户按下F5键或使用浏览器菜单进行刷新,但我们...

    javascript经典特效---禁止刷新页面.rar

    在JavaScript编程中,有时我们可能需要实现特定的功能,比如防止用户意外或恶意地刷新页面,以确保数据的一致性和用户体验。这个"javascript经典特效---禁止刷新页面.rar"压缩包文件包含了一个示例,展示了如何使用...

    多功能网页刷新助手 (1).zip

    通常,用户可以通过浏览器上的刷新按钮或按下键盘上的F5键来实现这一操作。然而,对于需要频繁刷新的网页,手动操作无疑会增加用户的负担,这就是网页刷新工具应运而生的原因。 "多功能网页刷新助手"正如其名,提供...

    VBS语言如:wshshell.sendkeys "{F5}" 'F5按钮

    这对于自动化某些需要频繁按F5刷新的场景非常有用。 3. **VBS语法与注释**: 在VBS中,单行注释以单引号 `'` 开始。例如,`'F5按钮` 是对代码作用的简单注释,告诉读者这段代码的作用是按下F5键。 4. **应用实例*...

    一种Java Web数据提交中的防刷新令牌.pdf

    用户正常的操作处理并没有问题,但是用户可能无意或有意通过反复刷新页面(例如按 F5 键),导致数据的重复提交。甚至,通过代码的自动刷新方式,恶意反复提交数据。这很容易导致数据的混乱或不一致,并极大地增加...

    网页快速刷新浏览工具

    网页快速刷新浏览工具是一款专为用户设计的高效浏览软件,主要功能在于提供快速刷新网页的能力,尤其适用于需要频繁刷新页面的场景,如抢购、报名等。这款工具由作者自行编写,强调其无病毒特性,确保了用户在使用...

    解决win7资源管理器不自动刷新

    然而,有时可能会遇到资源管理器不自动刷新的问题,这可能导致用户无法立即看到文件或文件夹的更新,比如新建、删除、重命名等操作后,变化不会实时反映在窗口中。这种问题可能会影响工作效率,因此解决这个问题至关...

    ASP.Net中防止刷新自动触发事件的解决方案

    例如,恶意用户可能绕过客户端脚本,直接通过其他方式刷新页面。因此,建议在服务器端添加额外的安全检查机制。 - **用户体验**:对于非技术人员来说,这种做法可能会显得有些奇怪。可以考虑在页面中添加提示信息,...

    屏蔽鼠标右键、Ctrl+n、shift+F10、F5刷新、退格键 的javascript代码

    3. **安全性**:虽然这些代码可以防止一些简单的操作,但对于高级用户或恶意攻击者来说,这些措施往往不够有效。 #### 六、总结 本文详细介绍了如何通过JavaScript代码实现屏蔽鼠标右键、Ctrl+n、Shift+F10、F5...

    IE被恶意修改的十三种简单处理办法.docx

    1. 手动修改注册表:进入`HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer`分支,新建`ControlPanel`主键,在其中新建一个DWORD值,命名为`HomePage`,值设为`00000000`,然后按F5刷新。 2. 自动导入注册表...

    js 特效 html 特效 禁止刷新页面

    这个需求在一些数据交互频繁或者游戏应用中尤为常见,防止用户意外或恶意地刷新导致数据丢失或游戏进程被重置。本篇将详细介绍如何使用JavaScript(JS)和HTML特效来实现禁止页面刷新的功能。 首先,我们要理解的是...

    网络程序设计课程-课下作业_乱写1

    2. 防止重复提交和刷新:在网络应用程序中,尤其是在涉及数据修改的操作中,防止用户意外或恶意重复提交是一个重要的问题。例如,多次点击提交按钮可能导致数据的不一致。解决这个问题的一种常见方法是在服务器端...

    JSP防止网页刷新重复提交数据的几种方法

    在网页开发中,尤其是涉及到数据提交的场景,防止用户意外或恶意重复提交是非常重要的,因为这可能导致数据不一致和系统异常。JSP(JavaServer Pages)作为动态网页技术,提供了多种方式来解决这个问题。以下是一些...

    网页保护方法大全.pdf

    在脚本中,通过`onKeyDown()`函数检测特定按键的按下事件,例如`event.keyCode==116`(F5刷新)、`window.event.ctrlKey`(Ctrl键)、`window.event.shiftKey`以及`event.keyCode==122`(F2键),并且让这些操作无效...

    IE恶意网页破坏的简单修复方法.

    ### IE恶意网页破坏的简单修复方法 #### 一、默认主页被修改 **破坏特性**: 默认主页被自动更改为某个特定网站...通过以上步骤,可以有效地解决IE浏览器遭遇恶意网页破坏时的各种问题,确保用户的上网体验安全可靠。

    IE被恶意修改的十三种简单处理法.docx

    当IE浏览器遭遇恶意修改时,用户通常会发现主页、默认搜索引擎等被篡改,甚至无法通过常规设置恢复。以下介绍十三种简单处理办法来解决这一问题。 1. **默认主页被修改** - **处理方法**:通过手动修改注册表来...

    php防止用户重复提交表单

    在用户操作中,重复提交表单可能是因为用户无意中多次点击了提交按钮,或是攻击者故意尝试多次提交表单以达到某种恶意目的,比如耗尽服务端资源。 对于防止用户重复提交表单,可以采取多种方法: 1. 前端限制。...

Global site tag (gtag.js) - Google Analytics