Servlet&JSP-HTTP报文头获取及应用
完整代码请参考: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方法。
private void testPath(HttpServletRequest req, HttpServletResponse resp) {
// 访问地址为http://localhost/servlet/testHeader?name=Jack&age=20&sex=M
StringBuffer url = req.getRequestURL(); //http://localhost/servlet/testHeader
println("完整的URL地址为:" + url); String uri = req.getRequestURI(); // /servlet/testHeader
println("URI地址(返回主机和端口后,请求参数前的部分):" + uri); String contextPath = req.getContextPath(); // /servlet
println("项目的根路径contextPath:" + contextPath); String servletPath = req.getServletPath(); // /testHeader
println("不包含项目名的地址servletPath:" + servletPath); String queryString = req.getQueryString();
println("请求参数(仅支持GET方法):" + queryString);
}
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:生成请求的浏览器或其他客户程序,根据这个报头,可以针对不同类型的浏览器返回不同的内容。注意在必要时才使用该标识进行判断,该报文头是可以进行伪造的。
private void testHeaderMethod(HttpServletRequest req, HttpServletResponse resp) {
String authType = req.getAuthType();
println("认证类型:" + authType); String remoteUser = req.getRemoteUser();
println("登陆用户名:" + remoteUser); int contentLength = req.getContentLength();
println("请求消息正文的长度:" + contentLength); String contentType = req.getContentType();
println("正文的MIME类型:" + contentType); String method = req.getMethod();
println("请求方法(GET、POST等):" + method); String protocol = req.getProtocol();
println("协议:" + protocol); //获取单个报文头的多个值
Enumeration<String> headers = req.getHeaders("accept-language");
while (headers.hasMoreElements()) {
println("accept-language:" + headers.nextElement());
} //获取所有报文头名称
Enumeration<String> enums = req.getHeaderNames();
println("所有HTTP头部信息:");
while (enums.hasMoreElements()) {
String element = enums.nextElement();
println(">>>" + element + "=" + req.getHeader(element));
} //获取Cookie
Cookie[] cookies = req.getCookies();
println("cookie的信息:");
for (Cookie cookie : cookies) {
println(">>>注释:" + cookie.getComment());
println(">>>域名:" + cookie.getDomain());
println(">>>名字:" + cookie.getName());
println(">>>适用的路径:" + cookie.getPath());
println(">>>值:" + cookie.getValue());
println(">>>存活的时间:" + cookie.getMaxAge());
println(">>>遵从的是否是安全协议::" + cookie.getSecure());
println(">>>遵从的协议版本:" + cookie.getVersion());
}
}
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");
public class TestGzip extends BaseServlet { @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html");
resp.setCharacterEncoding("UTF-8"); if (isSupportGzip(req)) {
out = new PrintWriter(new GZIPOutputStream(resp.getOutputStream()));
resp.setHeader("Content-Encoding", "gzip");
} else {
out = resp.getWriter();
} for (int i = 0; i < 100000; i++) {
println(i + ":This is a test for gzip.");
} } //判断浏览器是否支持gzip压缩
private boolean isSupportGzip(HttpServletRequest req) {
String acceptEncoding = req.getHeader("Accept-Encoding");
if (acceptEncoding != null && acceptEncoding.contains("gzip")) {
return true;
}
return false;
}
Servlet&JSP-HTTP报文头获取及应用的更多相关文章
- servlet&jsp高级:第三部分
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- Servlet&jsp基础:第五部分
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- Servlet&jsp基础:第一部分
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- Servlet & JSP - 转发与重定向的区别
本文转载自:http://blog.csdn.net/kobejayandy/article/details/13762043 转发 转发的原理,可以通过下图展示: 浏览器的请求发送给组件 1,组件 ...
- Servlet&JSP基础
Servlet JSP JSP四种基本语法: JSP注释<%--注释内容--> JSP声明<%!变量.函数%> JSP表达式<%= ...
- Servlet&JSP中的知识点
先sun提出的是Servlet体系,这个体系使得使用JAVA的程序员也能开发基于B/S架构的WEB应用程序,使用Servlet类将HTTP请求和响应封装在标准JAVA类中来实现各种WEB应用方案.随着 ...
- 小峰servlet/jsp(1)
一.scriptlet标签: 通过scriptlet标签我们可以可以在jsp理嵌入java代码: 第一种:<%! %> 可以在里面定义全局变量.方法.类: 第二种:<% %> ...
- Servlet + JSP 时代
Spring,Django,Rails,Express这些框架技术的出现都是为了解决什么问题,现在这些框架都应用在哪些方面? - 知乎 https://www.zhihu.com/question/2 ...
- 面试题:servlet jsp cook session 背1
一.Servlet是什么?JSP是什么?它们的联系与区别是什么? Servlet是Java编写的运行在Servlet容器的服务端程序,狭义的Servlet是指Servlet接口,广义的Servlet是 ...
随机推荐
- (转)Java Socket编程
原文出自:http://www.cnblogs.com/rocomp/p/4790340.html Socket是网络驱动层提供给应用程序编程接口和一种机制.可以把Socket比喻成一个港口码头,应用 ...
- .NET之父 - Anders Hejlsberg
简介 安德斯·海尔斯伯格(Anders Hejlsberg,1960.12~),丹麦人,Turbo Pascal编译器的主要作者,Delphi和.NET之父! 安德斯·海尔斯伯格曾在丹麦技术大学学习工 ...
- poi入门之读写excel
Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能.该篇是介绍poi基本的 ...
- phalcon——闪存消息
使用两种适配器来定义消息传递给Flasher后的行为: (1)Phalcon\Flash\Direct:直接输出传递给flasher的消息 (2)Phalcon\Flash\Session:将消息临时 ...
- LeetCode 56. Merge Intervals (合并区间)
Given a collection of intervals, merge all overlapping intervals. For example,Given [1,3],[2,6],[8,1 ...
- 谈一谈原生JS中的【面向对象思想】
[重点提前说:面向对象的思想很重要!] 最近开始接触学习后台的PHP语言,在接触到PHP中的面向对象相关思想之后,突然想到之前曾接触的JS中的面向对象思想,无奈记性太差, ...
- co源码分析及其实践
本文始发于我的个人博客,如需转载请注明出处. 为了更好的阅读体验,可以直接进去我的个人博客看. 前言 知识储备 阅读本文需要对Generator和Promise有一个基本的了解. 这里我简单地介绍一下 ...
- linux dig 命令
dig 命令主要用来从 DNS 域名服务器查询主机地址信息. 查询单个域名的 DNS 信息 dig 命令最典型的用法就是查询单个主机的信息. $ dig baidu.com dig 命令默认的输出信息 ...
- java三级考试理论题
Java试卷 一.单项选择题: 1. 试题: 在WINDOWS环境下,ODBC在__A____中设置 A. 控制面板 B. 注册表 C. 浏览器 D. 写字板 2. 阅读以下描述: C <jsp ...
- .Net 中通用的FormatString格式符整理
格式化日期和数字的字符串经常要用到这个, 就把帮助里面的东西大概整理了一些列在这里了. 下表描述了用来格式化 DateTime 对象的标准格式说明符.格式说明符 名称 说明 d 短日期模式 显示由与当 ...