當瀏覽器請求網頁時,它會向 Web 服務器發送特定信息,這些信息不能被直接讀取,由於這些信息是做爲 HTTP 請求的頭的一部分進行傳輸的。您能夠查看 HTTP 協議 瞭解更多相關信息。html
下面的實例使用 HttpServletRequest 的 getHeaderNames() 方法讀取 HTTP 頭信息。該方法返回一個枚舉,包含與當前的 HTTP 請求相關的頭信息。java
一旦咱們有一個枚舉,咱們能夠以標準方式循環枚舉,使用 hasMoreElements() 方法來肯定什麼時候中止,使用nextElement() 方法來獲取每一個參數的名稱。web
1 package yuan; 2 3 //導入必需的 java 庫 4 import java.io.IOException; 5 import java.io.PrintWriter; 6 import java.util.Enumeration; 7 8 import javax.servlet.ServletException; 9 import javax.servlet.annotation.WebServlet; 10 import javax.servlet.http.HttpServlet; 11 import javax.servlet.http.HttpServletRequest; 12 import javax.servlet.http.HttpServletResponse; 13 14 @WebServlet("/DisplayHeader") 15 16 //擴展 HttpServlet 類 17 public class DisplayHeader extends HttpServlet { 18 19 // 處理 GET 方法請求的方法 20 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 21 { 22 // 設置響應內容類型 23 response.setContentType("text/html;charset=UTF-8"); 24 25 PrintWriter out = response.getWriter(); 26 String title = "HTTP Header 請求實例"; 27 String docType = 28 "<!DOCTYPE html> \n"; 29 out.println(docType + 30 "<html>\n" + 31 "<head><meta charset=\"utf-8\"><title>" + title + "</title></head>\n"+ 32 "<body bgcolor=\"#f0f0f0\">\n" + 33 "<h1 align=\"center\">" + title + "</h1>\n" + 34 "<table width=\"100%\" border=\"1\" align=\"center\">\n" + 35 "<tr bgcolor=\"#949494\">\n" + 36 "<th>Header 名稱</th><th>Header 值</th>\n"+ 37 "</tr>\n"); 38 39 Enumeration headerNames = request.getHeaderNames(); 40 41 while(headerNames.hasMoreElements()) { 42 String paramName = (String)headerNames.nextElement(); 43 out.print("<tr><td>" + paramName + "</td>\n"); 44 String paramValue = request.getHeader(paramName); 45 out.println("<td> " + paramValue + "</td></tr>\n"); 46 } 47 out.println("</table>\n</body></html>"); 48 } 49 // 處理 POST 方法請求的方法 50 public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 51 doGet(request, response); 52 } 53 }
此次偷懶,不配置web.xml了,由於有 第14行代碼 編程
@WebServlet("/DisplayHeader")
它的做用等同於配置了web.xml,結果以下:後端
cookie太多,顯示不是很合理瀏覽器
http://www.runoob.com/servlet/servlet-client-request.htmltomcat
您已經在前面的實例中看到 setContentType() 方法,下面的實例也使用了一樣的方法,此外,咱們會用 setIntHeader() 方法來設置 Refresh 頭。服務器
1 package yuan; 2 3 //導入必需的 java 庫 4 import java.io.IOException; 5 import java.io.PrintWriter; 6 import java.text.SimpleDateFormat; 7 import java.util.Calendar; 8 import java.util.Date; 9 10 import javax.servlet.ServletException; 11 import javax.servlet.annotation.WebServlet; 12 import javax.servlet.http.HttpServlet; 13 import javax.servlet.http.HttpServletRequest; 14 import javax.servlet.http.HttpServletResponse; 15 16 @WebServlet("/Refresh") 17 18 // 擴展 HttpServlet 類 19 public class Refresh extends HttpServlet { 20 21 // 處理 GET 方法請求的方法 22 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 23 // 設置刷新自動加載時間爲 5 秒 24 response.setIntHeader("Refresh", 5); 25 // 設置響應內容類型 26 response.setContentType("text/html;charset=UTF-8"); 27 28 // 使用默認時區和語言環境得到一個日曆 29 Calendar cale = Calendar.getInstance(); 30 // 將Calendar類型轉換成Date類型 31 Date tasktime = cale.getTime(); 32 // 設置日期輸出的格式 33 SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 34 // 格式化輸出 35 String nowTime = df.format(tasktime); 36 PrintWriter out = response.getWriter(); 37 String title = "自動刷新 Header設置 "; 38 String docType = "<!DOCTYPE html>\n"; 39 out.println( 40 docType + "<html>\n" + "<head><title>" + title + "</title></head>\n" + "<body bgcolor=\"#f0f0f0\">\n" 41 + "<h1 align=\"center\">" + title + "</h1>\n" + "<p>當前時間是:" + nowTime + "</p>\n"); 42 } 43 44 // 處理 POST 方法請求的方法 45 public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 46 doGet(request, response); 47 } 48 }
展現結果:時間5s自動刷新cookie
Servlet 過濾器能夠動態地攔截請求和響應,以變換或使用包含在請求或響應中的信息。app
能夠將一個或多個 Servlet 過濾器附加到一個 Servlet 或一組 Servlet。Servlet 過濾器也能夠附加到 JavaServer Pages (JSP) 文件和 HTML 頁面。調用 Servlet 前調用全部附加的 Servlet 過濾器。
Servlet 過濾器是可用於 Servlet 編程的 Java 類,能夠實現如下目的:
根據規範建議的各類類型的過濾器:
過濾器經過 Web 部署描述符(web.xml)中的 XML 標籤來聲明,而後映射到您的應用程序的部署描述符中的 Servlet 名稱或 URL 模式。
當 Web 容器啓動 Web 應用程序時,它會爲您在部署描述符中聲明的每個過濾器建立一個實例。
Filter的執行順序與在web.xml配置文件中的配置順序一致,通常把Filter配置在全部的Servlet以前。
如下是 Servlet 過濾器的實例,將輸出網站名稱和地址。本實例讓您對 Servlet 過濾器有基本的瞭解,您可使用相同的概念編寫更復雜的過濾器應用程序:
1 package yuan; 2 3 //導入必需的 java 庫 4 import javax.servlet.*; 5 import java.util.*; 6 7 //實現 Filter 類 8 public class LogFilter implements Filter { 9 public void init(FilterConfig config) throws ServletException { 10 // 獲取初始化參數 11 String site = config.getInitParameter("Site"); 12 13 // 輸出初始化參數 14 System.out.println("網站名稱: " + site); 15 } 16 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws java.io.IOException, ServletException { 17 18 // 輸出站點名稱 19 System.out.println("站點網址:www.baidu.com"); 20 21 // 把請求傳回過濾鏈 22 chain.doFilter(request,response); 23 } 24 public void destroy( ){ 25 /* 在 Filter 實例被 Web 容器從服務移除以前調用 */ 26 } 27 }
這邊使用前文提到的 DisplayHeader.java 爲例子:
定義過濾器,而後映射到一個 URL 或 Servlet,這與定義 Servlet,而後映射到一個 URL 模式方式大體相同。在部署描述符文件 web.xml 中爲 filter 標籤建立下面的條目:
<filter> <filter-name>LogFilter</filter-name> <filter-class>yuan.LogFilter</filter-class> <init-param> <param-name>site</param-name> <param-value>百度</param-value> </init-param> </filter> <filter-mapping> <filter-name>LogFilter</filter-name> <url-pattern>/DisplayHeader</url-pattern> </filter-mapping>
重啓tomcat,展現結果:
出現 網址名稱:百度 證實完成了filter的初始化。
輸入 http://localhost:8082/Servlet/DisplayHeader 測試,再次查看控制檯 Console:
出現了 站點網址:www.baidu.com,證實filter起了做用,若是輸入的url後綴不是 /DisplayHeader 則不會打印結果。
增長多個過濾器,能夠實現多層過濾。
菜鳥教程