disconnect-请问大家,浏览器关闭动态网页,服务器端能侦听到 吗 ?

问题描述

请问大家,浏览器关闭动态网页,服务器端能侦听到 吗 ?

场景一:浏览器关闭网页,服务器端能知道 吗?
场景二:android客户端下载页面或文件,然后取消下载,服务器端能知道 吗 ?

    我用java代码中的 HttpClient  和 HttpURLConnection 模拟测试,关闭连接

httpclient.getConnectionManager().shutdown(); 和 httpUrlConnection.disconnect(); 后 服务器端都是不知道的
请问大家, 是确实服务器端侦测不到,还是我方法不对?

解决方案

参考HTTP无状态协议

HTTP协议是无状态协议。
无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

参考http协议和web应用有状态和无状态辨析

http协议作为技术背景的web应用程序请求——应答模式是无状态的,这个事实基本不会发生改变,也不会因为加入cookies、session机制而变成有状态的。要明白,这种前后因果关系:“我们要实现的是一种web应用,实现这种应用的协议我们选择了http这种本质上是无状态的通信协议。但是事实上,我们需要我们的web应用是有状态的。所以我们加入了cookies、session等机制去实现由状态的web应用”。所以我们可以这么理解:
Web应用=http协议+session、cookies等状态机制+其他辅助的机制。

如果想知道客户端是否关闭,需要客户端想服务器端报告,比如通过jsJS监听关闭浏览器事件之Onunload与Onbeforeunload,当然,可能还有其他方法

解决方案二:

场景一:浏览器关闭网页,服务器端能知道 吗?
服务器不知道
场景二:android客户端下载页面或文件,然后取消下载,服务器端能知道 吗 ?
这就看你下载文件采用什么方式,如果你在下载的时候服务器监听下载流的话,服务器可以知道是否取消下载。否则不知道!

解决方案三:

如果当前会话尚未结束,是可以侦听到的
否则不可以

解决方案四:

你需要的是长连接,普通的http请求服务器响应后就断开了,关闭浏览器服务端不可能知道的,看看tomcat的comet

解决方案五:

对于场景二:
String fileName = fileInfo.getOriginalName();
String nowPath = PropertyUtil.get("root_dir") + fileInfo.getFilePath();
response.setContentType("application/x-download");

    InputStream in = null;
    OutputStream out = null;

    try {
        // 以流的形式下载文件
        in = new BufferedInputStream(new FileInputStream(nowPath));
        out = new BufferedOutputStream(response.getOutputStream());
        byte[] b = new byte[1024];
        int i = 0;
        while ((i = in.read(b)) > 0) {
            out.write(b, 0, i);
        }
        out.flush();
        // out.close();
        fileDevice.setFileStatus(FileConstant.FILE_STATUS_DOWNLOAD);
        this.fileDeviceRelationService.updateFileDeviceRelationByCondition(fileDevice);
    } catch (Exception e) {
        logger.debug("/content/download_contents error by " + e.getMessage(), e.getCause());
        httpStatus = org.springframework.http.HttpStatus.NOT_FOUND;
        return new ResponseEntity<Map<String, Object>>(map, httpStatus);
    } finally {
        if (in != null) {
            in.close();
            in = null;
        }
        if (out != null) {
            out.close();
            out = null;
        }
    }
    return new ResponseEntity(httpStatus);

            以上是程序代码,设计的初衷是:
                   Android客户端在下载文件的时候,如有没有此文件,就告诉客户端,此文件未找到,如果有此文件,就将文件流response给android客户端。
                    Android客户端正在下载文件的时候,如果客户端取消下载(会调用httpclient.getConnectionManager().shutdown();),那么服务器端能catch到 连接被中断的 IO异常,可实际情况是,服务器根本不知道连接被中断,因此无法知道 客户端取消下载了。
                    我的理解是,这种文件下载,通过流传输,也是建立一种tcp连接,按道理,在传输的过程中,一端关闭,另一端是知道的。
                    到底是我理解的有问题,还是 程序写的有问题呢?
时间: 2024-07-30 15:23:49

disconnect-请问大家,浏览器关闭动态网页,服务器端能侦听到 吗 ?的相关文章

ASP.NET性能优化之让浏览器缓存动态网页的方法_实用技巧

OutputCache是针对所有访问服务器资源的用户,本篇要介绍的浏览器缓存则是针对单个用户,让浏览器在我们的控制下彻底不持续访问服务器上的动态内容,也就是我们要让浏览器变成我们的缓存机制中的一部分,在某些特定的场景下最大化地提升ASP.NET站点的性能.如果说OutputCache是从广度上提升并发效率,则浏览器缓存是从深度上提升效率. 一:HTTP头简介 1.1浏览器第一次请求 假设我们请求一个URL地址,譬如我服务器上的一个静态页面http://192.168.0.77/luminji2/

ASP入门教程-静态网页和动态网页

静态网页与动态网页的区别在于Web服务器对它处理方式不同.了解这种区别对于ASP概念的理解至关重要. 1.静态网页 静态网页是标准的HTML文件,其文件扩展名是.htm或.html.它可以包含HTML标记.文本.Jave小程序.客户端脚本以及客户端ActiveX控件,但这种网页不包含任何服务器端脚本,该页中的每一行HTML代码都是在放置到Web服务器前由网页设计人员编写的,在放置到Web服务器后便不再发生任何更改,所以称之为静态网页. 静态网页的处理流程如下图: 步骤1:Web浏览器请求静态网页

360浏览器如何恢复关闭的网页

  方法一: 直接按住Ctrl+E键来恢复关闭的网页,这个方法最简单,按一次就会恢复一个网页,并且是按照你关闭的顺序来恢复,如果是不小心全部关闭也可以通过此方法来恢复. 方法二: 1.在360浏览器菜单栏下面最右面找到"网页回收站"图标,如图所示(360浏览器7以后的版本是左转的一个图标). 2.在"网页回收站"图标右侧下拉列表中找到刚才关闭的网页并单击.

火狐浏览器打开的网页意外关闭怎么恢复

现在,不少人都在使用火狐浏览器.在使用过程中,有时因为自己不小心关闭了没有读完的网页,有时想打开已经关闭的网页重新阅读.现在小编介绍几种方法来帮助大家恢复已经关闭的网页,提高浏览效率,节约时间.一起来看看火狐浏览器意外关闭的网页恢复技巧吧. 火狐浏览器打开的网页意外关闭怎么恢复页面 方法一:如果你安装了火狐手势扩展FireGestures,你可以按住鼠标右键,划一下手势" 右→左",即可恢复关闭的标签页. 方法二:右键任何一个标签,选择 恢复关闭的标签页. 方法三:直接用快捷键Ctrl

火狐浏览器意外关闭的网页怎么恢复?

  我们在浏览网页时,有时因为自己不小心关闭了没有读完的网页,有时想打开已经关闭的网页重新阅读.现在我介绍几种方法来帮助大家恢复已经关闭的网页,提高浏览效率,节约时间. 方法一:如果你安装了火狐手势扩展FireGestures,你可以按住鼠标右键,划一下手势" 右→左",即可恢复关闭的标签页. 方法二:右键任何一个标签,选择 恢复关闭的标签页. 方法三:直接用快捷键Ctrl+Shift+T,恢复刚关闭的标签页. 方法四:最传统的方法是从历史记录里恢复.打开历史纪录的三种方法: 1.依次

在IE浏览器中恢复意外关闭的网页

意外关闭的两类常见情况: 常见情况 第一类是在浏览网页过程中浏览器意外崩溃了,这类情况影响比较大,可能会导致我们正在浏览的所有网页都关闭了. 第二类是我们的鼠标误操作,误点了关闭按钮,将正在浏览的选项卡页或单个IE窗口给关闭了,这类情况影响相对较小. 介绍完两类常见的情况,我们在依次根据不同的情况介绍解决方法. 解决方法 第一类情况,我们只需要开启 IE 浏览器的"自动崩溃恢复"功能即可,设置后,当您的IE浏览器被意外关闭,在您重启浏览器后,便会收到"是否需要恢复被关闭网页&

2345浏览器怎么恢复误关闭的网页

  在我们使用2345智能浏览器时,难免会误关到已打开的网页页面,对于遇到这类问题的用户,我们可通过浏览器中的恢复功能来恢复被误关闭的网页,那么在2345浏览器中如何恢复被误关的网页呢?下面看下小编带来的详细方法吧!   操作方法 单击标签栏右侧的网页恢复按钮,即可恢复最近关闭的网页.单击按钮旁边的下拉箭头即可打开网页撤销列表,从撤销列表中可以找到之前访问的网页. 通过上述方法我们就能够恢复被误关闭的网站页面了

360浏览器如何快速恢复打开刚关闭的网页?

  方法一: 直接按住Ctrl+E键来恢复关闭的网页,这个方法最简单,按一次就会恢复一个网页,并且是按照你关闭的顺序来恢复,如果是不小心全部关闭也可以通过此方法来恢复. 方法二: 1.在360浏览器菜单栏下面最右面找到"网页回收站"图标,如图所示(360浏览器7以后的版本是左转的一个图标). 2.在"网页回收站"图标右侧下拉列表中找到刚才关闭的网页并单击.

360浏览器怎么恢复关闭的网页

  方法一: 直接按住Ctrl+E键来恢复关闭的网页,这个方法最简单,按一次就会恢复一个网页,并且是按照你关闭的顺序来恢复,如果是不小心全部关闭也可以通过此方法来恢复. 方法二: 1.在360浏览器菜单栏下面最右面找到"网页回收站"图标,如图所示(360浏览器7以后的版本是左转的一个图标). 2.在"网页回收站"图标右侧下拉列表中找到刚才关闭的网页并单击.