日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

第十一章_文件下载

發布時間:2023/11/27 生活经验 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第十一章_文件下载 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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;@Overridepublic 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>


這樣就能避免其它站點使用爬蟲等技術進行圖片下載。直接復制圖片地址是訪問不到圖片的。

轉載于:https://www.cnblogs.com/wzzkaifa/p/6794510.html

總結

以上是生活随笔為你收集整理的第十一章_文件下载的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。