论坛首页 Java版 Webwork

关于如何处理类似"刷新"等重复提交的问题

浏览 7716 次
该帖已经被评为精华帖
作者 正文
最后更新时间:2004-08-23
我是看到下面xylohouse的关于“当用户关闭浏览器,如何kill掉服务器端为其执行的程序”想到的,他其中提到一点 -- 如果用户“刷新" 的情况

这一点应该是可以做到,参见“Using a Request Filter to Limit the Load on Web Applications”
http://www.onjava.com/pub/a/onjava/2004/03/24/loadcontrol.html

当已有request未处理完,有新的request进来,保存之,即使之前已有被保存的对象,也将其替换。就是说永远只有一个待处理的request。

举个例子:无耐心的用户点击标题新闻,没等到新页面打开,又点击了天气预报,然后又点击了体育栏目。事实上server只应该给用户看到的是体育栏目,标题新闻已经在处理中就无法避免,但是天气预报可以不用处理,而直接处理体育栏目,类似的统一页面刷新应该也是这样处理。


关键代码如下:
[code:1]synchronized( getSynchronizationObject( session ))
{
  // if another request is being processed,
  // then wait
  if( isRequestInProcess( session ) )
  {
    // Put this request in the queue and wait
    enqueueRequest( httpRequest );
    if( !waitForRelease( httpRequest ) )
    {
      // this request was replaced in the
      // queue by another request so it need
      // not be processed
      return;
      }
    }

    // lock the session, so that no other
    // requests are processed until this
    // one finishes
    setRequestInProgress( httpRequest );
  }

  // process this request, and then release the
  // session lock regardless of any exceptions
  // thrown farther down the chain.
  try
  {
    chain.doFilter( request, response );
  }
  finally
  {
    releaseQueuedRequest( httpRequest );
  }[/code:1]
   
最后更新时间:2004-08-23
对了,要有选择的进行filter,图片或是其他的静态页面就没有必要了,通过对同一session的request的控制,应该也可以在一定程度上避免恶意攻击脚本。
   
0 请登录后投票
最后更新时间:2004-08-23
lllyq 写道
对了,要有选择的进行filter,图片或是其他的静态页面就没有必要了,通过对同一session的request的控制,应该也可以在一定程度上避免恶意攻击脚本。



通过对同一session的request的控制,应该也可以在一定程度上避免恶意攻击脚本。这是对的!

但是如果想提升性能,用SESSION和上面的方法,反而只会大大降低性能. 当用户点开一个网页时,不等待,再点另外的网页,这种情况不可能占访问用户的50%以上.如果再作专门处理,呵呵,情况只会更坏!
   
0 请登录后投票
最后更新时间:2004-08-23
dhj1 写道
lllyq 写道
对了,要有选择的进行filter,图片或是其他的静态页面就没有必要了,通过对同一session的request的控制,应该也可以在一定程度上避免恶意攻击脚本。



通过对同一session的request的控制,应该也可以在一定程度上避免恶意攻击脚本。这是对的!

但是如果想提升性能,用SESSION和上面的方法,反而只会大大降低性能. 当用户点开一个网页时,不等待,再点另外的网页,这种情况不可能占访问用户的50%以上.如果再作专门处理,呵呵,情况只会更坏!


我想任何一种技术都有它适用的范围,那么以上这个范例我觉得比较适合用在很耗时的某几个页面(因为它是filter,用在什么地方你自己决定),也就是说由这个filter所增加的时间占整个处理时间的比重来决定,所占比重越小越有意义,不知道是不是还要举个例子说明:)
   
0 请登录后投票
最后更新时间:2004-08-24
"当用户关闭浏览器,如何kill掉服务器端为其执行的程序"

这样能节省多少系统资源?

应当从瓶颈入手。
   
0 请登录后投票
最后更新时间:2004-08-24
lllyq 写道
dhj1 写道
lllyq 写道
对了,要有选择的进行filter,图片或是其他的静态页面就没有必要了,通过对同一session的request的控制,应该也可以在一定程度上避免恶意攻击脚本。



通过对同一session的request的控制,应该也可以在一定程度上避免恶意攻击脚本。这是对的!

但是如果想提升性能,用SESSION和上面的方法,反而只会大大降低性能. 当用户点开一个网页时,不等待,再点另外的网页,这种情况不可能占访问用户的50%以上.如果再作专门处理,呵呵,情况只会更坏!


我想任何一种技术都有它适用的范围,那么以上这个范例我觉得比较适合用在很耗时的某几个页面(因为它是filter,用在什么地方你自己决定),也就是说由这个filter所增加的时间占整个处理时间的比重来决定,所占比重越小越有意义,不知道是不是还要举个例子说明:)


我是理解是这样的:
1.比如APACHE等服务程序,在启动后自动开了很多进程在内存中等待,用户访问这个网站时,直接联到内存的一个线程上,这样速度就很快(IIS是什么样的,本人没研究过).
2.B/S是无态协议,服务器端不会主动向浏览器这一端发送信息.只有浏览器这一方发出信息后,服务器处理了将信息返回到用户这边来.信息返回完后,几秒钟,或几十秒后就自动断开联结了.这样有别于一般C/S程序的做法,是为了提高性能.

结合上述原理可知:论坛上有人提出,"当用户提交后不等结果,再点别的网站,要自动Kill掉进程". 我认为是不可理解的,进程是Kill不掉的,最多回收到内存中等待下一次使用. 还有,"当用户提交后不等结果,再点别的网站,要自动Kill掉进程".是用普通C/S(有态)的观点来理解B/S(无态).存在概念上的理解错误.
由于B/S的无态,为了解决这个问题,引出了HttpSession,以解决B/S无态的问题.但是这个HttpSession的有态是很有限的,只是记录了用户提交信息时的一些信息.本质上还是无态.

那么对于特别的应用,比如有一个巨大的运算,是否可以半途中止呢,此贴作者已经给出了一个特别的例子.是可以做到的.
   
0 请登录后投票
最后更新时间:2004-08-24
HTTP1.1其实是可以有态的,只不过在很多时候不需要而罢了,有态的速度无法让人接受(像FTP).

session是不单单可记录一些基本信息,你可以让它记录很多其它的东西,它在客户端只不过是用url或者cookies记录了一个sessionID,再到server端找到这个对象(或者想要的东西,有点类似hash表).

只不过觉得维护这个session有点麻烦.又不能夸域.
   
0 请登录后投票
最后更新时间:2004-08-24
对了,我没有试过上面的例子(对不起,这点我很不对).

我想楼主应该试过的.是吗?

我想问,如果我是用同一个IE window,打开其它的几个不同的连接(shift  + click on link),情况会怎么样?
如果像dhj1所说的那样,通过对同一session的request的控制.
那么我说的其它几个连接就会被终止是吗?

例如:
假设置csdn采用了这种技术.
我看到csdn的头条新闻有好几条我没有看过,在等待的时候,我想把其它的几个也打开,就会按住shift 点击连接(其实csdn的会自动打开一个窗口),这时候,是不是我早前打开的(但还没有被完成),是不是就会被终止呢???
   
0 请登录后投票
最后更新时间:2004-08-24
xiaoyu 写道
对了,我没有试过上面的例子(对不起,这点我很不对).

我想楼主应该试过的.是吗?

我想问,如果我是用同一个IE window,打开其它的几个不同的连接(shift  + click on link),情况会怎么样?
如果像dhj1所说的那样,通过对同一session的request的控制.
那么我说的其它几个连接就会被终止是吗?

例如:
假设置csdn采用了这种技术.
我看到csdn的头条新闻有好几条我没有看过,在等待的时候,我想把其它的几个也打开,就会按住shift 点击连接(其实csdn的会自动打开一个窗口),这时候,是不是我早前打开的(但还没有被完成),是不是就会被终止呢???


虽然我不否认上面的技术的价值. 但是我认为要解决系统的性能.按上面的方法来解决,收效是很微弱的,严格的来说,上面的例子,除了能学习一些原理之外,毫无用处!

我们应该从宏观,而不是微观来解决问题. 我们可以使用互载均衡技术,分布式组件技术,HTML缓冲技术,表缓冲技术等等来入手!

在访问量并发很低的系统中.如果有人点开几个网页不等网页出来就点别的网页,对系统毫无影响.
在并发量很高的系统中,几百上千人同时在线,又有多少人点开几个网页不等网页出来就点别的网页?花力气节约了这点资源.对系统的瓶装又有多少影响?我不相信节约了这点资源就解决了并发量大的问题.

做技术一定要解决问题,而不能设过度,否则花力气还没效果!
   
0 请登录后投票
最后更新时间:2004-08-24
我也是觉得不太实用才说的....

其实我觉得用js在客户端控制刷新会更好一点(如果是解决刷新问题,不过这也只能用到浏览器特别有的api才行,我不知道还有没有其它的方法,如果有希望贴上).
   
0 请登录后投票
论坛首页 Java版 Webwork

跳转论坛:
JavaEye推荐