Servlet实现代理文件下载功能

 更新时间:2017年12月18日 09:34:43   作者:blue_jjw  
这篇文章主要为大家详细介绍了Servlet实现代理文件下载功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

用户向代理服务器发送请求,代理服务器从后端服务器上获取文件,并返回给用户
web.xml:

<servlet> 
 <servlet-name>BigFile</servlet-name> 
 <servlet-class>cn.ac.dsp.servlet.BigFile</servlet-class> 
</servlet> 
 <servlet-mapping> 
 <servlet-name>BigFile</servlet-name> 
 <url-pattern>*.ts</url-pattern> 
</servlet-mapping> 

servlet:

package cn.ac.dsp.servlet; 
 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.PrintWriter; 
import java.io.StringWriter; 
 
import javax.servlet.ServletException; 
import javax.servlet.ServletOutputStream; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
 
import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.client.ClientProtocolException; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.apache.http.params.CoreConnectionPNames; 
import org.apache.http.params.CoreProtocolPNames; 
import org.apache.log4j.Logger; 
 
import cn.ac.dsp.common.Constant; 
import cn.ac.dsp.common.SystemParameters; 
 
/** 
 * 给静态大文件提供服务的servlet 
 */ 
public class BigFile extends HttpServlet { 
 private static final long serialVersionUID = 1L; 
 private static final Logger log = Logger.getLogger(BigFile.class); 
  
 /** 
  * @see HttpServlet#HttpServlet() 
  */ 
 public BigFile() { 
  super(); 
  // TODO Auto-generated constructor stub 
 } 
 
 /** 
  * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 
  */ 
 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
  log.info("request for bigfile"); 
  long startTime = System.nanoTime(); 
  String requestUrl = request.getRequestURI(); 
  //请求的文件名 
  String filename = requestUrl.substring(requestUrl.lastIndexOf("/")); 
  HttpClient httpClient = new DefaultHttpClient(); 
  httpClient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, Constant.HttpConnTimeOut); 
  httpClient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, Constant.SoConnTimeOut); 
  httpClient.getParams().setParameter(CoreProtocolPNames.HTTP_CONTENT_CHARSET, "UTF-8"); 
  //后端服务器的IP 
  String serverIP = "192.168.101.190"; 
  //后端服务器的文件地址 
  StringBuilder backUrl = new StringBuilder(); 
  backUrl.append("http://"); 
  backUrl.append(serverIP); 
  backUrl.append("/LBA/bigfile/"); 
  backUrl.append(filename); 
  HttpGet httpGet = new HttpGet(backUrl.toString()); 
  httpGet.getParams().setParameter(CoreProtocolPNames.HTTP_CONTENT_CHARSET, "UTF-8"); 
  log.info("distribute bigfile to " + backUrl.toString()); 
  HttpResponse backResponse; 
  try { 
   backResponse = httpClient.execute(httpGet); 
//   log.info(backResponse.getParams().getParameter(CoreProtocolPNames.HTTP_CONTENT_CHARSET)); 
   HttpEntity httpEntity = backResponse.getEntity(); 
   InputStream in = httpEntity.getContent(); 
//   BufferedReader br = new BufferedReader(new InputStreamReader(httpEntity.getContent(), "UTF-8")); 
   byte[] buf = new byte[4096]; 
   int readLength; 
   response.setCharacterEncoding("UTF-8"); 
   ServletOutputStream out = response.getOutputStream(); 
   while((readLength = in.read(buf)) != -1){ 
    out.write(buf, 0, readLength); 
   }  
   in.close(); 
   out.flush(); 
   out.close(); 
  } catch (ClientProtocolException e) { 
   StringWriter sw = new StringWriter(); 
   e.printStackTrace(new PrintWriter(sw)); 
   log.error("ClientProtocolException when redirect bigfile. " + sw.toString());  
  } catch (IOException e) { 
   StringWriter sw = new StringWriter(); 
   e.printStackTrace(new PrintWriter(sw)); 
   log.error("IOException when redirect bigfile. " + sw.toString());  
  } 
  long endTime = System.nanoTime(); 
  System.out.println("Response time: " + (endTime-startTime) + " ns"); 
 } 
 
 /** 
  * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 
  */ 
 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
  // TODO Auto-generated method stub 
 } 
 
} 

参考:一个文件下载的Servlet

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • java获取当前日期和时间的二种方法分享

    java获取当前日期和时间的二种方法分享

    这篇文章主要介绍了java获取当前日期和时间的二种方法,需要的朋友可以参考下
    2014-03-03
  • Java由浅入深全面讲解方法的使用

    Java由浅入深全面讲解方法的使用

    方法,也称函数,如果想要重复一段或者多段代码块的使用,可以将这些代码封装成一个方法,方法具体表现为某种行为,使用方法可以提高代码的复用性
    2022-04-04
  • 在SpringBoot中如何利用Redis实现互斥锁

    在SpringBoot中如何利用Redis实现互斥锁

    当我们利用Redis存储热点数据时,突然就过期失效或者被删除了,导致大量请求同时访问数据库,增加了数据库的负载,为减轻数据库的负载我们利用互斥锁,本文重点介绍在SpringBoot中如何利用Redis实现互斥锁,感兴趣的朋友一起看看吧
    2023-09-09
  • springboot 接口返回字符串带引号的问题解决

    springboot 接口返回字符串带引号的问题解决

    本文主要介绍了springboot 接口返回字符串带引号的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • 专属于程序员的浪漫-Java输出动态闪图iloveyou

    专属于程序员的浪漫-Java输出动态闪图iloveyou

    这篇文章主要介绍了专属于程序员的浪漫-Java输出动态闪图iloveyou,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • Java中Date与String相互转换的方法

    Java中Date与String相互转换的方法

    这篇文章主要为大家详细介绍了Java中Date与String相互转换方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • java实现字符串和数字转换工具

    java实现字符串和数字转换工具

    这篇文章主要为大家详细介绍了java实现字符串和数字转换工具,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-04-04
  • mybatis-generator生成文件覆盖问题的解决

    mybatis-generator生成文件覆盖问题的解决

    这篇文章主要介绍了mybatis-generator生成文件覆盖问题的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • Springboot内嵌SQLite配置使用详解

    Springboot内嵌SQLite配置使用详解

    这篇文章主要介绍了Springboot内嵌SQLite配置使用详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-08-08
  • ElasticSearch的安装与基本概念

    ElasticSearch的安装与基本概念

    这篇文章主要介绍了ElasticSearch的安装与基本概念,提供了一个分布式多用户能力的全文搜索引擎,Elasticsearch是用Java开发的,需要的朋友可以参考下
    2023-04-04

最新评论