第十一章_文件下载

wzzkaifa wzzkaifa     2022-08-29     687

关键词:

11.1、文件下载概述

1、将响应的内容类型设置为文件的内容类型。标头Content-type用来规定实体主体中的数据类型,包括媒体类型和子类型标识符。

2、加入一个名为Content-DispositionHTTP响应头,给它赋值attachmentfilename=filename,这里的fileName是指在文件下载对话框中显示出来的默认文件名称。

它通常与文件名称同样,可是也能够不同。

比如,下面就是将一个文件发送到浏览器的代码范例。

FileInputStream fis = new FileInputStream(file) ;

BufferedInputStream bis = new BufferedInputStream(fis) ;

byte[] bytes = new byte[bis.available()] ;

response.setContentType(contentType) ;

OutputStream os = response.getOutputStream() ;

bis.read(bytes) ;

os.write(bytes) ;

警告:一定要确保你没有在无意中发送超出实际文件内容以外的不论什么字符。

这有可能在你毫不知情的情况下发生。比如,假设须要在JSP页面中使用page指令,能够这么写:

<%@ page import=”java.io.FileInputStream”%>

<jsp:useBean id=”DBBeanId” scope=”page” class=”MyBean”>

在你毫不察觉的情况下,page指令后面的回车换行符就会被发送给浏览器。为了防止发送多余的字符。须要像以下这样编写这个指令:

<%@ page import=”java.io.FileInputStream”

%><jsp:useBean id=”DBBeanId” scope=”page” class=”MyBean”>

 

11.2、范例1:隐藏资源

在以下这个程序中,我们用一个FileDownloadServlet servletsecret.pdf文件发送到浏览器。可是,仅仅有授权用户才干浏览。假设用户没有登录,应用程序就会跳转到Login页面。在这里,用户能够在表单中输入username和password,这些内容都将被提交给还有一个ServletLoginServlet

LoginServlet.java

package filedownloaded;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@WebServlet(urlPatterns = {"/login"})
public class LoginServlet extends HttpServlet{

	private static final long serialVersionUID = 1L;
	
	public void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException,
			IOException {
		String userName = request.getParameter("userName") ;
		String password = request.getParameter("password") ;
		if(userName != null && userName.equals("ken")
				&& password != null && password.equals("secret")){
			HttpSession session = request.getSession(true) ;
			session.setAttribute("loggedIn", Boolean.TRUE);
			response.sendRedirect("download");
			return ;
		}else{
			RequestDispatcher dispatcher = 
					request.getRequestDispatcher("/login.jsp") ;
			dispatcher.forward(request, response);
		}
	}
	
}

login.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP ‘login.jsp‘ starting page</title>
    
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

  </head>
  
  <body>
    <form action="login" method="post">
    	<table>
    		<tr>
    			<td>User name: </td>
    			<td><input name="userName"/></td>
    		</tr>
    		<tr>
    			<td>Password: </td>
    			<td><input name="password" type="password"/></td>
    		</tr>
    		<tr>
    			<td colspan="2">
    				<input type="submit" value="login"/>
    			</td>
    		</tr>
    	</table>
    </form>
  </body>
</html>
FileDownloadServlet.java

package filedownloaded;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@WebServlet(urlPatterns = {"/download"})
public class FileDownloadServlet extends HttpServlet{

	private static final long serialVersionUID = 1L;
	
	@Override
	public void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		HttpSession session = req.getSession() ;
		if(session == null || session.getAttribute("loggedIn") == null){
			RequestDispatcher dispatcher = req.getRequestDispatcher("/login.jsp") ;
			dispatcher.forward(req, resp); 
			return ;
		}
		String dataDirectory = req.getServletContext().getRealPath("/WEB-INF/data") ;
		File file = new File(dataDirectory, "secret.pdf") ;
		if(file.exists()){
			resp.setContentType("application/pdf");
			resp.addHeader("Content-Disposition", "attachment; filename=secret.pdf");
			byte[] buffer = new byte[1024] ;
			try(FileInputStream fis = new FileInputStream(file) ;
				BufferedInputStream bis = new BufferedInputStream(fis);
				OutputStream os = resp.getOutputStream()){
				int i = bis.read(buffer) ;
				while(i != -1){
					os.write(buffer, 0, i);
					i = bis.read(buffer) ;
				}
			}catch(IOException e){
				e.printStackTrace();
			}
		}
	}
	
}

12.3、范例2:防止跨站引用

竞争对手非常可能试图通过跨站引用来“窃取”你的网络资产,比如将你的贵重物品显示在他们的站点上,好像哪些东西就是他们的一样。假设通过编程的方式。仅当referer标头中包括你的域名时才发送资源,那么就能够防止上述情况的发生。当然。那种意志坚定的窃贼还是有可能下载到你的资产,可是那就要费一番功夫了。

以下的应用使用了一个Servlet。当且仅当referer标头不为空时,才将图片发送到浏览器。这样就能够防止直接在浏览器中输入其网址就能下载到图片。

ImageServlet.java

package filedownloaded;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet(urlPatterns = {"/getImage"})
public class ImageServlet extends HttpServlet{

	private static final long serialVersionUID = 1L;
	
	public void doGet(HttpServletRequest request, 
			HttpServletResponse response) throws ServletException,
			IOException{
		String referer = request.getHeader("referer") ;
		if(referer != null){
			String imageId = request.getParameter("id") ;
			String imageDirectory = request.getServletContext().getRealPath("/WEB-INF/image") ;
			File file = new File(imageDirectory, imageId + ".jpg") ;
			if(file.exists()){
				response.setContentType("image/jpg");
				byte[] buffer = new byte[1024] ;
				try(FileInputStream fis = new FileInputStream(file) ;
					BufferedInputStream bis = new BufferedInputStream(fis);
					OutputStream os = response.getOutputStream()){
					int i = bis.read(buffer) ;
					while(i != -1){
						os.write(buffer, 0, i);
						i = bis.read(buffer) ;
					}
				}catch(IOException e){
					e.printStackTrace();
				}
			}
		}
	}
	
}

images.html

<!DOCTYPE html>
<html>
  <head>
    <title>images.html</title>
	
    <meta name="keywords" content="keyword1,keyword2,keyword3">
    <meta name="description" content="this is my page">
    <meta name="content-type" content="text/html; charset=UTF-8">
    
    <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->

  </head>
  
  <body>
    <img src="getImage?

id=1"/> <img src="getImage?id=2"/> <img src="getImage?id=3"/> <img src="getImage?id=4"/> <img src="getImage?

id=5"/> <img src="getImage?id=6"/> <img src="getImage?id=7"/> <img src="getImage?

id=8"/> <img src="getImage?id=9"/> <img src="getImage?id=10"/> </body> </html>


这样就能避免其它站点使用爬虫等技术进行图片下载。直接复制图片地址是訪问不到图片的。

第十一章第一节功

一.功1.功定义: 一个      作用在物体上,物体在                     ___________ 查看详情

第十一章实用类

下面的程序涉及到了类的构造函数,默认构造函数,析构函数,转换函数,友元函数,运算符重载。1//头文件,a.h2#ifndefa_H_//宏名不应以数字打头3#definea_H_45#include<string>67classAnimal8{9private:10std::stringanimal;11intweight;12intnum;1314publ... 查看详情

第十一章springboot+mongodb(简单查询)

1、mongodb在mac上的安装下载mongodb,https://www.mongodb.org/解压缩到一个指定文件夹,如:/Users/enniu1/Desktop/zjg/mongodb-osx-x86_64-3.2.6(这是我的mongodb的版本)配置PATH输入命令:"vi~/.bash_profile"添加如下两句配置:1exportMONGO_HOME=/Users/enniu 查看详情

第十一章判断已输入的文字是否是数字

650)this.width=650;"src="http://s5.51cto.com/wyfs02/M01/89/15/wKiom1gHEN2Q445TAACRcIZ8s3U214.png-wh_500x0-wm_3-wmp_4-s_3150700510.png"title="1.png"alt="wKiom1gHEN2Q445TAACRcIZ8s3U214.png-wh_50"/><s 查看详情

第十一章

因为是手机上传,有些图没有上传好,晚上回去重新弄。 查看详情

第十一章网络编程

--------------------------------------------------------Sun11Feb13:30:10GMT2018--------------------------------------------------------第十一章网络编程11.1Theclient-ServerprogrammingModelThefundamentaloperati 查看详情

第十一章练习压缩和远程传输文件

<<<第十二单元练习>>>在server主机中把/etc目录打包压缩到/mnt中,名字为etc.tar.gztar zcvf /mnt/etc.tar.gz /etc2.复制server主机中的etc.tar.gz到desktop主机的/mnt中 scp /mnt/etc.tar.gz[email pr 查看详情

操作系统第十一章文件系统的实现

文件系统的实现文件控制块 设备驱动和中断处理硬件指令 注意:不同的产商,硬件指令不同 由逻辑系统让大家看到的东西  设备层处理来自I/O控制层的指令逻辑文件系统 文件控制块FCBFileControlBlock虚拟文... 查看详情

第十一章网络文件共享服务之samba

Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成。在此之前我们已经了解了NFS和FTP,NFS与samba一样,也是在网络中实现文件共享的一种实现,但不幸的是,其不支持windows平台,而本章要提到的samb... 查看详情

第十一章

一.分组查询   1.语法    SELECT...FROM...GROUPBY...    --分组查询Groupby    selectCOUNT(*)as学生人数,GradeIdas年级编号fromStudentgroupbyGradeId&n 查看详情

高数(a)下第十一章(持续更新)

11.1 11.2 查看详情

第十一章linq

DataLibusingSystem;usingSystem.Collections.Generic;namespaceWrox.ProCSharp.LINQ{[Serializable]publicclassTeam{publicTeam(stringname,paramsint[]years){this.Name=name;this.Years=newList<int>(years 查看详情

html第十一章总结

#第十一章总结:本章的标题为:layoutandpositioningArrangingElement##前言:这一章节,通过已经知道的boxmodel的概念,进行讲述关于layout的知识,并且通过这些知识进行创造专业的设计和multicolumnlayouts.##谈谈Flow###对于blockelement*对blockeleme... 查看详情

第十一章多元线性回归与相关分析

  查看详情

第十一章springboot事物管理器(代码片段)

一、springboot整合事物管理 springboot默认集成事物,只主要在方法上加上@Transactional即可二、SpringBoot分布式事物管理使用springboot+jta+atomikos 分布式事物管理 1、pom文件<parent><groupId>org.springframework.boot</groupI 查看详情

第十一章线程

第十一章线程11.3线程标识每个线程也有一个线程ID,线程ID只有在它所属的进程上下文中才有意义。/* 比较两个线程ID,相等返回非0数值,否则返回0*/#include<pthread.h>intpthread_equal(pthread_ttid1,pthread_ttid2); /* 获得自身... 查看详情

第十一章

(1)1.万物皆对象:(地球上有什么?我们会不自觉的将地球上的事物归为具体类别) 2.对象:顾客   ,   收银员;               官方定义:用来... 查看详情

第十一章笔记

                                 &n 查看详情