一、HttpServletRequest
1.HttpServletRequest
1)獲取請求頭
Enumeration<String> e = request.getHeaderNames();
while(e.hasMoreElements()){
String headerName = e.nextElement();//透明稱
Enumeration<String> headerValues = request.getHeaders(headerName);
while(headerValues.hasMoreElements()){
System.out.println(headerName+":"+headerValues.nextElement());
}
}
2)獲取請求參數(shù)
String userName=request.getParameter("userName");
3)設置與獲取屬性
request.setAttribute("admin", "管理員");
4)請求轉發(fā)
request.getRequestDispatcher("index.jsp").forward(request, response);
5)文件上傳
當數(shù)據(jù)以multipart/form-data的格式發(fā)送時,servlet容器支持文件上傳。
如果servlet容器提供multipart/form-data格式數(shù)據(jù)的處理,可通過HttpServletRequest中的以下方法得到:
public Collection<Part> getParts()獲取所有的文件上傳域。
public Part getPart(String name) 根據(jù)名稱獲取文件的上傳域。
Part類代表從multipart/form-data格式的POST請求中接收到的一個部分或表單項。 每個part都可通過Part.getInputStream方法訪問頭部,相關的內(nèi)容類型和內(nèi)容。
表單enctype屬性:
<form enctype="value">
| 值 | 描述 |
|---|---|
| application/x-www-form-urlencoded | 在發(fā)送前編碼所有字符(默認) |
| multipart/form-data | 不對字符編碼。在使用包含文件上傳控件的表單時,必須使用該值。 |
| text/plain | 空格轉換為 "+" 加號,但不對特殊字符編碼。 |
A.@MultipartConfig注解屬性
1.location屬性被解析為一個絕對路徑且默認為javax.servlet.context.tempdir。如果指定了相對地址,它將是相對于tempdir位置。
Location:指定存儲所上傳文件的目錄分以下兩種情況
1)若part.write(fileName)傳的參數(shù)只有上傳的文件名,那么最后文件就會被上傳到location目錄中若此時location所指定的目錄不存在,則會報告下面的異常(Tomcat7.x啟動時不會報)
java.io.IOException: The temporary upload location [D:\upload\22] is not valid
2)若part.write(savePath+"/"+fileName),則無論location是否指定目錄,最后文件都會被上傳到savePath,但是,如果此時location所指定的目錄不存在,那么也會報告第一種情況中的異常,并導致上傳文件失敗。
2.fileSizeThreshold:設置閾值,達到閾值后會將所上傳的文件從臨時目錄中寫到磁盤..單位為byte,默認值是0
3.maxFileSize:允許上傳的單個文件最大值,即不限制文件總數(shù)及總大小,只限制單個文件..單位為byte,默認值是-1,即無限制。
4.maxRequestSize:允許上傳的文件的最大值,這里指的是一次性上傳的所有文件的合計大小..單位也是byte,默認值是-1,即無限制。
B.上傳頁面:
<%@page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>文件上傳</title>
</head>
<body>
<form name="fileupform" enctype="multipart/form-data" method="post"
action="UploadServlet">
文件:<input type="file" name="file"> <br>
說明:<input type="text" id="name" name="name" /><br>
<input type="submit" value="提交" />
<br>
</form>
</body>
</html>
C.上傳Servlet:
/**
* @MultipartConfig上傳文件注解
*/
@WebServlet("/UploadServlet")
@MultipartConfig(fileSizeThreshold=1024*1024*2, maxFileSize=1024*1024*20, maxRequestSize=1024*1024*200)?
public class UploadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public UploadServlet() {
super();
}
/**
* 上傳方法
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
//設置編碼
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//獲取文件對象
Part part = request.getPart("file");
//header值為: form-data; name="file"; filename="xxx.txt"
String header = part.getHeader("content-disposition");
//獲取文件名,截取最后一個=與"之間的字符串,即文件名
String fileName = header.substring(header.lastIndexOf("=")+2, header.lastIndexOf("\""));
//文件上傳
part.write(getServletContext().getRealPath("/")+"upload\\" + fileName);
PrintWriter out = response.getWriter();
out.println("head:content-disposition: " + header + "<br>");
out.println("文件名: " +fileName + "<br>");
out.println("文件域name:"+part.getName() + "<br>");
out.println("此文件的大?。?+part.getSize()+"<br />");
out.println("此文件類型:"+part.getContentType()+"<br />");
//獲取文本框描述內(nèi)容
out.println("說明:"+request.getParameter("name")+"<br />");
out.flush();
out.close();
}
}
D. XML配置:
<multipart-config>
<location>/tmp</location>
<max-file-size>20848820</max-file-size>
<max-request-size>418018841</max-request-size>
<file-size-threshold>1048576</file-size-threshold>
</multipart-config>
- 瀏覽器端的重要頭信息
| 頭信息 | 描述 |
|---|---|
| Accept | 這個頭信息指定瀏覽器或其他客戶端可以處理的 MIME 類型。值 image/png 或 image/jpeg 是最常見的兩種可能值。 |
| Accept-Charset | 這個頭信息指定瀏覽器可以用來顯示信息的字符集。例如 ISO-8859-1。 |
| Accept-Encoding | 這個頭信息指定瀏覽器知道如何處理的編碼類型。值 gzip 或 compress 是最常見的兩種可能值。 |
| Accept-Language | 這個頭信息指定客戶端的首選語言,在這種情況下,Servlet 會產(chǎn)生多種語言的結果。例如,en、en-us、ru 等。 |
| Authorization | 這個頭信息用于客戶端在訪問受密碼保護的網(wǎng)頁時識別自己的身份。 |
| Connection | 這個頭信息指示客戶端是否可以處理持久 HTTP 連接。持久連接允許客戶端或其他瀏覽器通過單個請求來檢索多個文件。值 Keep-Alive 意味著使用了持續(xù)連接。 |
| Content-Length | 這個頭信息只適用于 POST 請求,并給出 POST 數(shù)據(jù)的大?。ㄒ宰止?jié)為單位)。 |
| Cookie | 這個頭信息把之前發(fā)送到瀏覽器的 cookies 返回到服務器。 |
| Host | 這個頭信息指定原始的 URL 中的主機和端口。 |
| If-Modified-Since | 這個頭信息表示只有當頁面在指定的日期后已更改時,客戶端想要的頁面。如果沒有新的結果可以使用,服務器會發(fā)送一個 304 代碼,表示 Not Modified 頭信息。 |
| If-Unmodified-Since | 這個頭信息是 If-Modified-Since 的對立面,它指定只有當文檔早于指定日期時,操作才會成功。 |
| Referer | 這個頭信息指示所指向的 Web 頁的 URL。例如,如果您在網(wǎng)頁 1,點擊一個鏈接到網(wǎng)頁 2,當瀏覽器請求網(wǎng)頁 2 時,網(wǎng)頁 1 的 URL 就會包含在 Referer 頭信息中。 |
| User-Agent | 這個頭信息識別發(fā)出請求的瀏覽器或其他客戶端,并可以向不同類型的瀏覽器返回不同的內(nèi)容。 |
- 讀取 HTTP 頭的方法
這些方法通過 HttpServletRequest 對象可用。
| 序號 | 方法 & 描述 |
|---|---|
| 1 | Cookie[] getCookies() 返回一個數(shù)組,包含客戶端發(fā)送該請求的所有的 Cookie 對象。 |
| 2 | Enumeration getAttributeNames() 返回一個枚舉,包含提供給該請求可用的屬性名稱。 |
| 3 | Enumeration getHeaderNames() 返回一個枚舉,包含在該請求中包含的所有的頭名。 |
| 4 | Enumeration getParameterNames() 返回一個 String 對象的枚舉,包含在該請求中包含的參數(shù)的名稱。 |
| 5 | HttpSession getSession() 返回與該請求關聯(lián)的當前 session 會話,或者如果請求沒有 session 會話,則創(chuàng)建一個。 |
| 6 | HttpSession getSession(boolean create) 返回與該請求關聯(lián)的當前 HttpSession,或者如果沒有當前會話,且創(chuàng)建是真的,則返回一個新的 session 會話。 |
| 7 | Locale getLocale() 基于 Accept-Language 頭,返回客戶端接受內(nèi)容的首選的區(qū)域設置。 |
| 8 | Object getAttribute(String name) 以對象形式返回已命名屬性的值,如果沒有給定名稱的屬性存在,則返回 null。 |
| 9 | ServletInputStream getInputStream() 使用 ServletInputStream,以二進制數(shù)據(jù)形式檢索請求的主體。 |
| 10 | String getAuthType() 返回用于保護 Servlet 的身份驗證方案的名稱,例如,"BASIC" 或 "SSL",如果JSP沒有受到保護則返回 null。 |
| 11 | String getCharacterEncoding() 返回請求主體中使用的字符編碼的名稱。 |
| 12 | String getContentType() 返回請求主體的 MIME 類型,如果不知道類型則返回 null。 |
| 13 | String getContextPath() 返回指示請求上下文的請求 URI 部分。 |
| 14 | String getHeader(String name) 以字符串形式返回指定的請求頭的值。 |
| 15 | String getMethod() 返回請求的 HTTP 方法的名稱,例如,GET、POST 或 PUT。 |
| 16 | String getParameter(String name) 以字符串形式返回請求參數(shù)的值,或者如果參數(shù)不存在則返回 null。 |
| 17 | String getPathInfo() 當請求發(fā)出時,返回與客戶端發(fā)送的 URL 相關的任何額外的路徑信息。 |
| 18 | String getProtocol() 返回請求協(xié)議的名稱和版本。 |
| 19 | String getQueryString() 返回包含在路徑后的請求 URL 中的查詢字符串。 |
| 20 | String getRemoteAddr() 返回發(fā)送請求的客戶端的互聯(lián)網(wǎng)協(xié)議(IP)地址。 |
| 21 | String getRemoteHost() 返回發(fā)送請求的客戶端的完全限定名稱。 |
| 22 | String getRemoteUser() 如果用戶已通過身份驗證,則返回發(fā)出請求的登錄用戶,或者如果用戶未通過身份驗證,則返回 null。 |
| 23 | String getRequestURI() 從協(xié)議名稱直到 HTTP 請求的第一行的查詢字符串中,返回該請求的 URL 的一部分。 |
| 24 | String getRequestedSessionId() 返回由客戶端指定的 session 會話 ID。 |
| 25 | String getServletPath() 返回調(diào)用 JSP 的請求的 URL 的一部分。 |
| 26 | String[] getParameterValues(String name) 返回一個字符串對象的數(shù)組,包含所有給定的請求參數(shù)的值,如果參數(shù)不存在則返回 null。 |
| 27 | boolean isSecure() 返回一個布爾值,指示請求是否使用安全通道,如 HTTPS。 |
| 28 | int getContentLength() 以字節(jié)為單位返回請求主體的長度,并提供輸入流,或者如果長度未知則返回 -1。 |
| 29 | int getIntHeader(String name) 返回指定的請求頭的值為一個 int 值。 |
| 30 | int getServerPort() 返回接收到這個請求的端口號。 |
| 31 | int getParameterMap() 將參數(shù)封裝成 Map 類型。 |
- HttpServletResponse
- 輸出文本
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.write("今天是個好日子");
- 重定向
response.sendRedirect("index.jsp");
- 瀏覽器的最有用的 HTTP 1.1 響應報頭
| 頭信息 | 描述 |
|---|---|
| Allow | 這個頭信息指定服務器支持的請求方法(GET、POST 等)。 |
| Cache-Control | 這個頭信息指定響應文檔在何種情況下可以安全地緩存??赡艿闹涤校簆ublic、private或 no-cache 等。Public 意味著文檔是可緩存,Private 意味著文檔是單個用戶私用文檔,且只能存儲在私有(非共享)緩存中,no-cache 意味著文檔不應被緩存。 |
| Connection | 這個頭信息指示瀏覽器是否使用持久 HTTP 連接。值 close 指示瀏覽器不使用持久 HTTP 連接,值 keep-alive 意味著使用持久連接。 |
| Content-Disposition | 這個頭信息可以讓您請求瀏覽器要求用戶以給定名稱的文件把響應保存到磁盤。 |
| Content-Encoding | 在傳輸過程中,這個頭信息指定頁面的編碼方式。 |
| Content-Language | 這個頭信息表示文檔編寫所使用的語言。例如,en、en-us、ru 等。 |
| Content-Length | 這個頭信息指示響應中的字節(jié)數(shù)。只有當瀏覽器使用持久(keep-alive)HTTP 連接時才需要這些信息。 |
| Content-Type | 這個頭信息提供了響應文檔的 MIME(Multipurpose Internet Mail Extension)類型。 |
| Expires | 這個頭信息指定內(nèi)容過期的時間,在這之后內(nèi)容不再被緩存。 |
| Last-Modified | 這個頭信息指示文檔的最后修改時間。然后,客戶端可以緩存文件,并在以后的請求中通過 If-Modified-Since 請求頭信息提供一個日期。 |
| Location | 這個頭信息應被包含在所有的帶有狀態(tài)碼的響應中。在 300s 內(nèi),這會通知瀏覽器文檔的地址。瀏覽器會自動重新連接到這個位置,并獲取新的文檔。 |
| Refresh | 這個頭信息指定瀏覽器應該如何盡快請求更新的頁面。您可以指定頁面刷新的秒數(shù)。 |
| Retry-After | 這個頭信息可以與 503(Service Unavailable 服務不可用)響應配合使用,這會告訴客戶端多久就可以重復它的請求。 |
| Set-Cookie | 這個頭信息指定一個與頁面關聯(lián)的 cookie。 |
- 設置 HTTP響應報頭的方法
| 序號 | 方法 & 描述 |
|---|---|
| 1 | String encodeRedirectURL(String url) 為 sendRedirect 方法中使用的指定的 URL 進行編碼,或者如果編碼不是必需的,則返回 URL 未改變。 |
| 2 | String encodeURL(String url) 對包含 session 會話 ID 的指定 URL 進行編碼,或者如果編碼不是必需的,則返回 URL 未改變。 |
| 3 | boolean containsHeader(String name) 返回一個布爾值,指示是否已經(jīng)設置已命名的響應報頭。 |
| 4 | boolean isCommitted() 返回一個布爾值,指示響應是否已經(jīng)提交。 |
| 5 | void addCookie(Cookie cookie) 把指定的 cookie 添加到響應。 |
| 6 | void addDateHeader(String name, long date) 添加一個帶有給定的名稱和日期值的響應報頭。 |
| 7 | void addHeader(String name, String value) 添加一個帶有給定的名稱和值的響應報頭。 |
| 8 | void addIntHeader(String name, int value) 添加一個帶有給定的名稱和整數(shù)值的響應報頭。 |
| 9 | void flushBuffer() 強制任何在緩沖區(qū)中的內(nèi)容被寫入到客戶端。 |
| 10 | void reset() 清除緩沖區(qū)中存在的任何數(shù)據(jù),包括狀態(tài)碼和頭。 |
| 11 | void resetBuffer() 清除響應中基礎緩沖區(qū)的內(nèi)容,不清除狀態(tài)碼和頭。 |
| 12 | void sendError(int sc) 使用指定的狀態(tài)碼發(fā)送錯誤響應到客戶端,并清除緩沖區(qū)。 |
| 13 | void sendError(int sc, String msg) 使用指定的狀態(tài)發(fā)送錯誤響應到客戶端。 |
| 14 | void sendRedirect(String location) 使用指定的重定向位置 URL 發(fā)送臨時重定向響應到客戶端。 |
| 15 | void setBufferSize(int size) 為響應主體設置首選的緩沖區(qū)大小。 |
| 16 | void setCharacterEncoding(String charset) 設置被發(fā)送到客戶端的響應的字符編碼(MIME 字符集)例如,UTF-8。 |
| 17 | void setContentLength(int len) 設置在 HTTP Servlet 響應中的內(nèi)容主體的長度,該方法設置 HTTP Content-Length 頭。 |
| 18 | void setContentType(String type) 如果響應還未被提交,設置被發(fā)送到客戶端的響應的內(nèi)容類型。 |
| 19 | void setDateHeader(String name, long date) 設置一個帶有給定的名稱和日期值的響應報頭。 |
| 20 | void setHeader(String name, String value) 設置一個帶有給定的名稱和值的響應報頭。 |
| 21 | void setIntHeader(String name, int value) 設置一個帶有給定的名稱和整數(shù)值的響應報頭。 |
| 22 | void setLocale(Locale loc) 如果響應還未被提交,設置響應的區(qū)域。 |
| 23 | void setStatus(int sc) 為該響應設置狀態(tài)碼。 |
- 文件下載:
- HttpSession
- 設置與獲取屬性
HttpSession session = request.getSession();
session.setAttribute("admin", "admin");
- 設置Session周期
HttpSession session = request.getSession();
session.setMaxInactiveInterval(1000);
- 銷毀Session
HttpSession session = request.getSession();
session.invalidate();
- URL重寫
URL重寫的優(yōu)缺點:
- 使用Url重寫的優(yōu)點:
有利于搜索引擎的抓取,因為現(xiàn)在大部分的搜索引擎對動態(tài)頁面的抓取還比較弱,它們更喜歡抓取一些靜態(tài)的頁面。而我們現(xiàn)在的頁面大部分的數(shù)據(jù)都是動態(tài)的顯示的。這就需要我們把動態(tài)頁面變成靜態(tài)的頁面,有利于搜索引擎的抓取。
讓用戶更容易理解,很少有用戶去關心你網(wǎng)站的頁面的地址,但對一般的大中型網(wǎng)站增強可讀性還是必須的。這樣會讓你的網(wǎng)站更加完美。
隱藏技術的實現(xiàn),我們可以通過Url重寫可以實現(xiàn)技術的隱藏。不至于暴露你所采用的技術,給一些想攻擊你網(wǎng)站的愛好者提供方便。
可以很方便的重用,提高網(wǎng)站的移植性。如果我們后臺方法改動的話,可以保證前臺的頁面部分不用改。這樣就提高了網(wǎng)站的移植性。 - 使用Url重寫也有缺點:
因為URL是通過過濾器原理來實現(xiàn)的,就以為著又多了一道訪問,會多少影響點訪問速度的,這個可以忽略不計,它的工作原理說白了它就是一個簡單的過濾器(Filter),將請求的url 轉換成我們想要的url,再對它進行請求的過程。
為了防止用戶禁用cookie,可以使用URL重寫技術來實現(xiàn)會話跟蹤
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
HttpSession session = request.getSession();
// 調(diào)用response的encodeURL方法,將自動將JSESSION追加到<u>url</u>后面,
// 如:url;jsessionid=BD111FFC653497E81B702A29B3AC6FE4
String url = response.~~encodeRedirectUrl~~("index.jsp");
out.write(url);
}