完整代码请参考:https://github.com/devway9/java-exercise/tree/master/servlet-jsp

目录

  • 1 HttpServletRequest获取报文头  
  • 2 获取URL的方法
  • 3 常用报文头获取
  • 4 发送压缩的Web页面

正文

1 HttpServletRequest获取报文头
  1) 报文头是由浏览器产生的,不同的浏览器会返回不同的信息。可以使用HttpServletRequest的方法获取。

2 获取URL的方法
  1) getRequestURL:获取完整的URL。
  2) getRequestURI:返回主机和端口后,请求参数前的部分。即web项目的根路径+请求地址
  3) getContextPath:web项目的根路径,即部署的项目名。
  4) getServletPath:不包含项目名的请求地址。(不包含web项目跟路径)
  5) getQueryString:获取请求参数,仅支持GET方法。

  1. private void testPath(HttpServletRequest req, HttpServletResponse resp) {
  2. // 访问地址为http://localhost/servlet/testHeader?name=Jack&age=20&sex=M
  3. StringBuffer url = req.getRequestURL(); //http://localhost/servlet/testHeader
  4. println("完整的URL地址为:" + url);
  5.  
  6. String uri = req.getRequestURI(); // /servlet/testHeader
  7. println("URI地址(返回主机和端口后,请求参数前的部分):" + uri);
  8.  
  9. String contextPath = req.getContextPath(); // /servlet
  10. println("项目的根路径contextPath:" + contextPath);
  11.  
  12. String servletPath = req.getServletPath(); // /testHeader
  13. println("不包含项目名的地址servletPath:" + servletPath);
  14.  
  15. String queryString = req.getQueryString();
  16. println("请求参数(仅支持GET方法):" + queryString);
  17. }

  

3 常用报文头获取
  1) getAuthType:获取认证类型。
  2) getRemoteUser:获取登陆用户名。
  3) getContentLength:获取正文内容长度,只适用于POST请求。
  4) getContentType:正文的MIME类型。
  5) getMethod:获取请求方法类型(GET、POST等)。
  6) getProtocol:获取请求的协议(如HTTP/1.1)。
  7) getHeaders:获取单个报文头的多个值。
  8) getHeaderNames:获取所有的报文头名称。
  9) getCookies:获取Cookie的信息(返回数组)。
  10) getHeader:获取单个报文头的值,比如resquest.getHeader("Accept"); 报文头名字忽略大小写。
    ① Accept:浏览器或其他客户程序能够处理的MIME类型,比如text/html。
    ② Accept-Charset:浏览器可接受的字符集。
    ③ Accept-Encoding:客户端可以处理的编码类型,比如gzip。
    ④ Accept-Language:浏览器期望的语言种类,比如zh-CN。
    ⑤ Authorization:身份标识信息。
    ⑥ Connection:客户端是否能处理持续性HTTP连接,Keep-Alive表明可以使用。
    ⑦ Content-Length:获取正文内容长度,只适用于POST请求。
    ⑧ Cookie:服务器发送给浏览器,后又有浏览器发送给服务器的内容,一般使用getCookies方法获取。
    ⑨ Host:URL中的主机名和端口号。
    ⑩ If-Modified-Since:只有当所请求的内容在指定的日期之后又经过修改才返回它,否则返回304“Not Modified”应答。
    11 Referer:前一个页面的URL。
    12 User-Agent:生成请求的浏览器或其他客户程序,根据这个报头,可以针对不同类型的浏览器返回不同的内容。注意在必要时才使用该标识进行判断,该报文头是可以进行伪造的。

  1. private void testHeaderMethod(HttpServletRequest req, HttpServletResponse resp) {
  2. String authType = req.getAuthType();
  3. println("认证类型:" + authType);
  4.  
  5. String remoteUser = req.getRemoteUser();
  6. println("登陆用户名:" + remoteUser);
  7.  
  8. int contentLength = req.getContentLength();
  9. println("请求消息正文的长度:" + contentLength);
  10.  
  11. String contentType = req.getContentType();
  12. println("正文的MIME类型:" + contentType);
  13.  
  14. String method = req.getMethod();
  15. println("请求方法(GET、POST等):" + method);
  16.  
  17. String protocol = req.getProtocol();
  18. println("协议:" + protocol);
  19.  
  20. //获取单个报文头的多个值
  21. Enumeration<String> headers = req.getHeaders("accept-language");
  22. while (headers.hasMoreElements()) {
  23. println("accept-language:" + headers.nextElement());
  24. }
  25.  
  26. //获取所有报文头名称
  27. Enumeration<String> enums = req.getHeaderNames();
  28. println("所有HTTP头部信息:");
  29. while (enums.hasMoreElements()) {
  30. String element = enums.nextElement();
  31. println(">>>" + element + "=" + req.getHeader(element));
  32. }
  33.  
  34. //获取Cookie
  35. Cookie[] cookies = req.getCookies();
  36. println("cookie的信息:");
  37. for (Cookie cookie : cookies) {
  38. println(">>>注释:" + cookie.getComment());
  39. println(">>>域名:" + cookie.getDomain());
  40. println(">>>名字:" + cookie.getName());
  41. println(">>>适用的路径:" + cookie.getPath());
  42. println(">>>值:" + cookie.getValue());
  43. println(">>>存活的时间:" + cookie.getMaxAge());
  44. println(">>>遵从的是否是安全协议::" + cookie.getSecure());
  45. println(">>>遵从的协议版本:" + cookie.getVersion());
  46. }
  47. }

      

4 发送压缩的Web页面
  1) 大多数浏览器都知道如何处理gzip压缩的内容,因此服务器可以使用Gzip对文档压缩,浏览器自动解压缩,对于较大的文本页面,Gzip压缩可以极大的节省网页下载时间。
  2) 可以通过Accept-Encoding判断浏览器是否支持Gzip。
  3) Servlet使用Gzip压缩页面进行传输:
    out = new PrintWriter(new GZIPOutputStream(resp.getOutputStream()));
    resp.setHeader("Content-Encoding", "gzip");

  1. public class TestGzip extends BaseServlet {
  2.  
  3. @Override
  4. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  5. resp.setContentType("text/html");
  6. resp.setCharacterEncoding("UTF-8");
  7.  
  8. if (isSupportGzip(req)) {
  9. out = new PrintWriter(new GZIPOutputStream(resp.getOutputStream()));
  10. resp.setHeader("Content-Encoding", "gzip");
  11. } else {
  12. out = resp.getWriter();
  13. }
  14.  
  15. for (int i = 0; i < 100000; i++) {
  16. println(i + ":This is a test for gzip.");
  17. }
  18.  
  19. }
  20.  
  21. //判断浏览器是否支持gzip压缩
  22. private boolean isSupportGzip(HttpServletRequest req) {
  23. String acceptEncoding = req.getHeader("Accept-Encoding");
  24. if (acceptEncoding != null && acceptEncoding.contains("gzip")) {
  25. return true;
  26. }
  27. return false;
  28. }

  

Servlet&JSP-HTTP报文头获取及应用的更多相关文章

  1. servlet&jsp高级:第三部分

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  2. Servlet&jsp基础:第五部分

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  3. Servlet&jsp基础:第一部分

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  4. Servlet & JSP - 转发与重定向的区别

    本文转载自:http://blog.csdn.net/kobejayandy/article/details/13762043 转发 转发的原理,可以通过下图展示: 浏览器的请求发送给组件 1,组件 ...

  5. Servlet&JSP基础

    Servlet     JSP     JSP四种基本语法:     JSP注释<%--注释内容-->     JSP声明<%!变量.函数%>     JSP表达式<%= ...

  6. Servlet&JSP中的知识点

    先sun提出的是Servlet体系,这个体系使得使用JAVA的程序员也能开发基于B/S架构的WEB应用程序,使用Servlet类将HTTP请求和响应封装在标准JAVA类中来实现各种WEB应用方案.随着 ...

  7. 小峰servlet/jsp(1)

    一.scriptlet标签: 通过scriptlet标签我们可以可以在jsp理嵌入java代码: 第一种:<%! %>  可以在里面定义全局变量.方法.类: 第二种:<% %> ...

  8. Servlet + JSP 时代

    Spring,Django,Rails,Express这些框架技术的出现都是为了解决什么问题,现在这些框架都应用在哪些方面? - 知乎 https://www.zhihu.com/question/2 ...

  9. 面试题:servlet jsp cook session 背1

    一.Servlet是什么?JSP是什么?它们的联系与区别是什么? Servlet是Java编写的运行在Servlet容器的服务端程序,狭义的Servlet是指Servlet接口,广义的Servlet是 ...

随机推荐

  1. 使用Angularjs和Vue.js对比

    使用Angularjs和Vue.js对比 之前项目都是使用Angularjs,(注明此处主要讲Angularjs 1)在初步使用Vue.js后做一个简答的对比笔记. 首先从理论上简单说一下各自的特点, ...

  2. hibernate和mybatis区别

    看图    Hibernate mybatis 难易度 难 简单,容易上手 编码 良好的映射机制,不需要关心 需要手动编写sql,resultMap 调优 制定合理的缓存策略: 尽量使用延迟加载特性: ...

  3. 读取本地的json文件

    最近写项目需要读取本地的json文件,然后悲催的发现前端新手的我居然不会,查查找找发现这东西并不难,但是应该是比较常用的,毕竟json太好用了! 我是直接用的jquery实现的,但是Ajax也可以,不 ...

  4. iOS之 Category 属性 的理解

    在 Objective-C 中可以通过 Category 给一个现有的类添加属性,但是却不能添加实例变量 反正读第一遍的时候我是有点晕的,可以添加“属性”,然后又说“添加实例变量”,第一感觉就好像 有 ...

  5. ABAP开源项目清单

    因为曾经的“SAP Code Exchange”平台已经于2013年倒闭,现在无论在SCN还是网络上都比较难找到一个地方来关注全部的优秀ABAP开源项目. 本文将这些项目的地址和他们的描述列出,以供参 ...

  6. ES6 class的继承使用细节

    ES6 class的继承与java的继承大同小异,如果学过java的话应该很容易理解,都是通过extends关键字继承. class Animal{ constructor(color){ this. ...

  7. FATE

    FATE Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissi ...

  8. 你不知的DOM编程

    前言:随着vue,react, angular的流行,可能现在我们不必经常的操作DOM,三大框架在副交互的操作中发挥着极大地优势.因为我们知道用脚本对DOM的操作非常昂贵,本文主要探讨常规的DOM操作 ...

  9. AngularJS学习篇(十)

    AngularJS Select(选择框) 使用 ng-options 创建选择框 在 AngularJS 中我们可以使用 ng-option 指令来创建一个下拉列表,列表项通过对象和数组循环输出,如 ...

  10. 全局作用域 eval

    eval是在caller的作用域里运行传给它的代码: var x = 'outer';   (function() {     var x = 'inner';     eval('x'); // & ...