当浏览器请求网页时,它会向 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 则不会打印结果。
增长多个过滤器,能够实现多层过滤。
菜鸟教程