package com.demo;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
public class DownloadServlet extends HttpServlet {
public static Logger log = Logger.getLogger(DownloadServlet.class);
private static final long serialVersionUID = 1L;
/**
* 实验:下载功能,当用户点击下载,弹出“保存,取消”的框后,如果用户不做任何点击,<br>
* 此时,服务器servlert的out.write是会hold住吗? 还是能继续输出?
* http://topic.csdn.net/u/20110915/09/7f162e68-7632-4985-9aab-920bb06df2cc
* .html?seed=1489779347&r=75525057#r_75525057
*
* (错误,请忽略)飞飞说,应该是cache在操作系统中(Socket内核相关)。我write了260M数据,看到java占用内存还是70M,所以确实有可能。
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设置响应头信息,下载的文件
String contentType = "application/octet-stream;charset=GBK";
String contentDisposition = "attachment; filename=\"demo.txt\"";
response.setContentType(contentType);
response.setHeader("Content-disposition", contentDisposition);
//response buffer
log.error(response.getBufferSize());
response.setBufferSize(1);
log.error(response.getBufferSize());
OutputStream os = response.getOutputStream();
PrintWriter pw = new PrintWriter(os);
Long i = 0L;
while (i++ < 10000000L) {// 260M的文件
pw.println("some test content.........");//
pw.flush();
}
pw.close();
// response.
// 即使不点击“保存”,也不会hold住,会继续输出下列log。而且,隔了30分钟后再点击“保存”,竟然还能下载成功。
log.error("outputstream closed! come here!");
}
}
demo见附件。
结论:
曹帅解答了我的疑惑,只要用户点击了下载资源的Url,无论用户是否点击“保
存”,浏览器会马上开始下载完整的response的(使用httpfox看确实是这样,我没点击“保存”它就已经下载完文件了),不管你是否点击保存,
保存的行为只是浏览器将下载完或正在下载的内容存到用户指定的文件中而已。(
再说,HTTP协议本身就是request/response,不可能还能根据用户是否点击保存的行为而Hold住的。)
同时,想想wget,是直接就下载吧,没有hold的。
20120301补充:后来验证过,ie和firefox行为不一样,iE会hold住。看来。。。结论还是:因浏览器而异!
(IE这么做,我一开始觉得不对劲,但是后来觉得还是合理的,想想做web im常用的comet方式,就是js在浏览器端发起请求,服务端若无数据就Blocked几十秒再返回响应。http没谈到请求/响应的时间间隙,故在请求和响应过程中,其中一方选择blocked,导致tcp暂时无数据传输(除了滑动窗口心跳通讯),也是合理的)
)
分享到:
相关推荐
点击链接,浏览器应弹出保存文件的对话框,用户可以选择保存到本地。 7. **安全注意事项** 实现文件下载时,必须考虑到安全性。避免路径遍历攻击,确保用户只能下载预设目录内的文件。此外,对于敏感文件,可能...
在Java Web开发中,Servlet是一种用于扩展服务器功能的Java类,它是J2EE(Java 2 Platform, Enterprise Edition)的一部分。本项目通过Servlet技术实现了用户注册、登录以及显示所有用户的功能,下面将详细阐述相关...
当用户在搜索框输入时,JavaScript监听输入事件,并通过Ajax发送请求到服务器。这个请求通常包含用户的部分输入,以便服务器根据这些信息查找匹配项。 Servlet是Java中的一个组件,用于处理来自客户端的HTTP请求。...
Servlet-api.jar是Java Web开发中不可或缺的一个库文件,它包含了Servlet和JSP(JavaServer Pages)规范的API接口。这个库文件主要用于与Web服务器交互,处理HTTP请求,并生成响应。在本文中,我们将深入探讨Servlet...
filename=filename.ext",这样浏览器就会弹出下载对话框,让用户选择保存位置。 在实际应用中,为了提高效率和安全性,可能需要考虑异步处理、文件缓存、权限控制等问题。例如,可以使用线程池异步处理大文件上传...
解压这个文件后,开发者可以查看和学习如何将这些技术结合使用来实现用户管理功能。 总结来说,JSP负责展示用户界面,JavaBean封装业务逻辑和数据,Servlet处理HTTP请求和响应,三者共同协作,构建了一个完整的用户...
3. **会话管理**:登录成功后,服务器通常会创建一个会话(session),并在其中保存用户的登录状态,以实现后续页面间的用户身份追踪。 4. **防止SQL注入**:在处理用户输入时,需使用参数化查询或预编译语句,防止...
在我们的例子中,服务器启动时会加载Servlet,然后初始化,接着处理来自用户的请求,最后当服务器关闭或Servlet不再需要时会被销毁。 2. **GET与POST请求**:HTTP协议中的两种主要请求方法。GET用于获取资源,其...
在IT行业中,Ajax(Asynchronous JavaScript and XML)技术是一种用于创建快速、动态网页的重要方法,它允许网页在不重新加载整个页面的情况下与服务器交换数据并更新部分网页内容。结合JSON(JavaScript Object ...
在本文中,我们将深入探讨如何使用Servlet技术来实现一个简单的用户登录功能。Servlet是一种Java编程接口,用于扩展服务器的功能,特别是在Web应用中处理HTTP请求。在这个项目中,我们结合了Servlet与JSP(Java...
在这个"Servlet 文件上传下载例子"中,我们将探讨如何使用Servlet实现文件的上传和下载功能,这对于构建一个简单的图片文件服务器至关重要。 1. **文件上传** - **MultipartRequest**: 在Servlet中,处理文件上传...
当服务器启动或第一次接收到Servlet请求时,Servlet容器(如Tomcat)会加载并初始化Servlet。初始化过程中,Servlet会执行`init()`方法,可以在此设置初始参数。服务阶段,Servlet通过`service()`或特定HTTP方法(如...
服务器会在响应中设置这个头,并指定文件名,这样浏览器就会弹出保存文件的对话框,让用户选择保存位置。 实现Servlet文件下载的步骤如下: 1. **创建Servlet类**:首先,你需要继承HttpServlet类并重写doGet或...
在这个"ajax+servlet原生实现智能提示框"的主题中,我们将深入探讨如何利用这两项技术来创建一个实时、动态的用户输入提示功能。 首先,让我们理解智能提示框的基本概念。在许多Web应用中,当用户在输入框中键入...
2. **Servlet处理请求**:在服务器端,`Servlet`接收到这个请求后,根据请求参数找到要下载的文件路径。这可能涉及到数据库查询或者文件系统操作。 3. **准备响应**:`Servlet`设置响应头,包括`Content-Type`...
在Java Web开发中,Servlet是一种Java编程语言编写的服务器端组件,主要用于扩展Web服务器的功能。在这个"Servlet文件下载项目"中,我们利用Servlet技术来实现文件的下载功能。这是一个非常实用的功能,尤其对于那些...
当用户登录成功后,服务器可以创建一个包含用户信息的Cookie,并将其发送给浏览器。浏览器会在后续的请求中自动附带这个Cookie,使得服务器能够识别出已经登录的用户,从而保持用户的会话状态。 在Servlet中使用...
1. 加载与实例化:当服务器启动或第一次接收到对Servlet的请求时,会加载Servlet类并创建其实例。 2. 初始化:实例化后,调用Servlet的init()方法进行初始化,一般用于配置和准备Servlet运行环境。 3. 服务:每次有...
一旦服务器响应,`processResponse()`函数被调用,根据服务器返回的状态码和数据处理响应,如弹出成功或失败的消息。 #### 后端实现(Servlet) 在后端部分,我们有`SignUpAction`类,它继承自`HttpServlet`。虽然...
当文件不存在或者服务器遇到其他问题时,Servlet应该返回适当的错误代码(如404 Not Found或500 Internal Server Error),以便客户端能正确处理。 ### 使用说明 1. 你需要将`服务器端`目录下的Java类部署到你的...