Open wangrongjia opened 5 years ago
一个完整的HTTP请求包括如下内容:一个请求行、若干消息头、以及实体内容
我们请求 http://localhost:8080/path1/index.html?name=abc
GET /path1/index.html HTTP/1.1 //请求行 Host: localhost:8080 //以下是消息头 Connection: keep-alive Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.104 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.8 If-None-Match: W/"4-1541484945504" If-Modified-Since: Tue, 06 Nov 2018 06:15:45 GMT name=abc //实体内容
请求行中的GET称之为请求方式,请求方式有:POST、GET、HEAD、OPTIONS、DELETE、TRACE、PUT,常用的有: GET、 POST 用户如果没有设置,默认情况下浏览器向服务器发送的都是get请求,例如在浏览器直接输地址访问,点超链接访问等都是get,用户如想把请求方式改为post,可通过更改表单的提交方式实现。 不管POST或GET,都用于向服务器请求某个WEB资源,这两种方式的区别主要表现在数据传递上:如果请求方式为GET方式,则可以在请求的URL地址后以?的形式带上交给服务器的数据,多个数据之间以&进行分隔,例如:GET /mail/1.html?name=abc&password=xyz HTTP/1.1 GET方式的特点:在URL地址后附带的参数是有限制的,其数据容量通常不能超过1K。 如果请求方式为POST方式,则可以在请求的实体内容中向服务器发送数据,Post方式的特点:传送的数据量无限制。
accept:浏览器通过这个头告诉服务器,它所支持的数据类型
accept
Accept-Charset: 浏览器通过这个头告诉服务器,它支持哪种字符集
Accept-Charset
Accept-Encoding:浏览器通过这个头告诉服务器,支持的压缩格式
Accept-Encoding
Accept-Language:浏览器通过这个头告诉服务器,它的语言环境
Accept-Language
Host:浏览器通过这个头告诉服务器,想访问哪台主机
Host
If-Modified-Since: 浏览器通过这个头告诉服务器,缓存数据的时间
If-Modified-Since
Referer:浏览器通过这个头告诉服务器,客户机是哪个页面来的 防盗链
Referer
Connection:浏览器通过这个头告诉服务器,请求完后是断开链接还是何持链接
Connection
一个HTTP响应代表服务器向客户端回送的数据,它包括: 一个状态行、若干消息头、以及实体内容 。
HTTP/1.1 200 //状态行 Accept-Ranges: bytes //以下是响应头 ETag: W/"4-1541484945504" Last-Modified: Tue, 06 Nov 2018 06:15:45 GMT Content-Type: text/html Content-Length: 4 Date: Tue, 06 Nov 2018 08:07:38 GMT
状态行格式: HTTP版本号 状态码 原因叙述
HTTP响应中的常用响应头(消息头)
Location: 服务器通过这个头,来告诉浏览器跳到哪里
Location
Server:服务器通过这个头,告诉浏览器服务器的型号
Server
Content-Encoding:服务器通过这个头,告诉浏览器,数据的压缩格式
Content-Encoding
Content-Length: 服务器通过这个头,告诉浏览器回送数据的长度
Content-Length
Content-Language: 服务器通过这个头,告诉浏览器语言环境
Content-Language
Content-Type:服务器通过这个头,告诉浏览器回送数据的类型
Content-Type
Refresh:服务器通过这个头,告诉浏览器定时刷新
Refresh
Content-Disposition: 服务器通过这个头,告诉浏览器以下载方式打数据
Content-Disposition
Transfer-Encoding:服务器通过这个头,告诉浏览器数据是以分块方式回送的
Transfer-Encoding
Expires : -1 控制浏览器不要缓存 Cache-Control: no-cache Pragma: no-cache
Expires
Cache-Control
Pragma
response.setStatus(302);//设置服务器的响应状态码 //设置响应头,服务器通过 Location这个头,来告诉浏览器跳到哪里,这就是所谓的请求重定向 response.setHeader("Location", "/JavaEETest/1.jsp");
String data = "abcdabcdabcdabcdabcdabcdab" + "cdabcdabcdabcdabcdabcdabcdabcdabc" + "dabcdabcdabcdabcdabcdabcdabcdabc" + "dabcdabcdabcdabcdabcdabcdabcdabcdab" + "cdabcdabcdabcdabcdabcdabcdabcdabcdab" + "cdabcdabcdabcdabcdabcdabcdabcdabcdab" + "cdabcdabcdabcdabcdabcdabcdabcdabcdab" + "cdabcdabcdabcdabcdabcdabcdabcdabcdabcd"; System.out.println("原始数据的大小为:" + data.getBytes().length); ByteArrayOutputStream bout = new ByteArrayOutputStream(); GZIPOutputStream gout = new GZIPOutputStream(bout); //buffer gout.write(data.getBytes()); gout.close(); //得到压缩后的数据 byte g[] = bout.toByteArray(); response.setHeader("Content-Encoding", "gzip"); response.setHeader("Content-Length",g.length +""); response.getOutputStream().write(g);
/** * 浏览器能接收(Accept)的数据类型有: * application/x-ms-application, * image/jpeg, * application/xaml+xml, * image/gif, * image/pjpeg, * application/x-ms-xbap, * application/vnd.ms-excel, * application/vnd.ms-powerpoint, * application/msword, */ //使用content-type响应头指定发送给浏览器的数据类型为"image/jpeg" response.setHeader("content-type", "image/jpeg"); //读取位于项目根目录下的img文件夹里面的WP_20131005_002.jpg这张图片,返回一个输入流 InputStream in = this.getServletContext().getResourceAsStream("/img/Chrysanthemum.jpg"); byte buffer[] = new byte[1024]; int len = 0; OutputStream out = response.getOutputStream();//得到输出流 while ((len = in.read(buffer)) > 0) {//读取输入流(in)里面的内容存储到缓冲区(buffer) out.write(buffer, 0, len);//将缓冲区里面的内容输出到浏览器 }
// 设置refresh响应头,让浏览器每隔3秒定时刷新 // response.setHeader("refresh", "3"); // 设置refresh响应头,让浏览器3秒后跳转到http://www.baidu.com response.setHeader("refresh", "3;url='http://www.baidu.com'"); response.getWriter().write("gacl");
// 设置content-disposition响应头,让浏览器下载文件 response.setHeader("content-disposition", "attachment;filename=xxx.jpg"); InputStream in = this.getServletContext().getResourceAsStream("/img/Chrysanthemum.jpg"); byte buffer[] = new byte[1024]; int len = 0; OutputStream out = response.getOutputStream(); while ((len = in.read(buffer)) > 0) { out.write(buffer, 0, len); }
ContentDispositionDemo:
ContentDispositionDemo
package com.codinger.HTTPDemo.ResponseHeaderDemo; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class ContentDesopositionDemo */ @WebServlet("/ContentDesopositionDemo") public class ContentDispositionDemo extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public ContentDispositionDemo() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 设置content-disposition响应头,让浏览器下载文件 response.setHeader("content-disposition", "attachment;filename=xxx.jpg"); InputStream in = this.getServletContext().getResourceAsStream("/img/Chrysanthemum.jpg"); byte buffer[] = new byte[1024]; int len = 0; OutputStream out = response.getOutputStream(); while ((len = in.read(buffer)) > 0) { out.write(buffer, 0, len); } } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } }
ContentEncodingDemo:
ContentEncodingDemo
package com.codinger.HTTPDemo.ResponseHeaderDemo; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.zip.GZIPOutputStream; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class ContentEncodingHeaderDemo */ @WebServlet("/ContentEncodingHeaderDemo") public class ContentEncodingDemo extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public ContentEncodingDemo() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String data = "abcdabcdabcdabcdabcdabcdab" + "cdabcdabcdabcdabcdabcdabcdabcdabc" + "dabcdabcdabcdabcdabcdabcdabcdabc" + "dabcdabcdabcdabcdabcdabcdabcdabcdab" + "cdabcdabcdabcdabcdabcdabcdabcdabcdab" + "cdabcdabcdabcdabcdabcdabcdabcdabcdab" + "cdabcdabcdabcdabcdabcdabcdabcdabcdab" + "cdabcdabcdabcdabcdabcdabcdabcdabcdabcd"; System.out.println("原始数据的大小为:" + data.getBytes().length); ByteArrayOutputStream bout = new ByteArrayOutputStream(); GZIPOutputStream gout = new GZIPOutputStream(bout); //buffer gout.write(data.getBytes()); gout.close(); //得到压缩后的数据 byte g[] = bout.toByteArray(); response.setHeader("Content-Encoding", "gzip"); response.setHeader("Content-Length",g.length +""); response.getOutputStream().write(g); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } }
ContentTypeDemo:
ContentTypeDemo
package com.codinger.HTTPDemo.ResponseHeaderDemo; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class ContentTypeDemo */ @WebServlet("/ContentTypeDemo") public class ContentTypeDemo extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public ContentTypeDemo() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /** * 浏览器能接收(Accept)的数据类型有: * application/x-ms-application, * image/jpeg, * application/xaml+xml, * image/gif, * image/pjpeg, * application/x-ms-xbap, * application/vnd.ms-excel, * application/vnd.ms-powerpoint, * application/msword, */ //使用content-type响应头指定发送给浏览器的数据类型为"image/jpeg" response.setHeader("content-type", "image/jpeg"); //读取位于项目根目录下的img文件夹里面的WP_20131005_002.jpg这张图片,返回一个输入流 InputStream in = this.getServletContext().getResourceAsStream("/img/Chrysanthemum.jpg"); byte buffer[] = new byte[1024]; int len = 0; OutputStream out = response.getOutputStream();//得到输出流 while ((len = in.read(buffer)) > 0) {//读取输入流(in)里面的内容存储到缓冲区(buffer) out.write(buffer, 0, len);//将缓冲区里面的内容输出到浏览器 } } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } }
LocationDemo:
LocationDemo
package com.codinger.HTTPDemo.ResponseHeaderDemo; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class ResponseHeadersDemo */ @WebServlet("/ResponseHeadersDemo") public class LocationDemo extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public LocationDemo() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setStatus(302);//设置服务器的响应状态码 //设置响应头,服务器通过 Location这个头,来告诉浏览器跳到哪里,这就是所谓的请求重定向 response.setHeader("Location", "/JavaEETest/1.jsp"); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } }
RefreshDemo:
RefreshDemo
package com.codinger.HTTPDemo.ResponseHeaderDemo; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class RefreshDemo */ @WebServlet("/RefreshDemo") public class RefreshDemo extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public RefreshDemo() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 设置refresh响应头,让浏览器每隔3秒定时刷新 // response.setHeader("refresh", "3"); // 设置refresh响应头,让浏览器3秒后跳转到http://www.baidu.com response.setHeader("refresh", "3;url='http://www.baidu.com'"); response.getWriter().write("gacl"); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } }
参考:https://www.cnblogs.com/xdp-gacl/category/574705.html
HTTP请求
一个完整的HTTP请求包括如下内容:一个请求行、若干消息头、以及实体内容
我们请求 http://localhost:8080/path1/index.html?name=abc
请求行
请求行中的GET称之为请求方式,请求方式有:POST、GET、HEAD、OPTIONS、DELETE、TRACE、PUT,常用的有: GET、 POST 用户如果没有设置,默认情况下浏览器向服务器发送的都是get请求,例如在浏览器直接输地址访问,点超链接访问等都是get,用户如想把请求方式改为post,可通过更改表单的提交方式实现。 不管POST或GET,都用于向服务器请求某个WEB资源,这两种方式的区别主要表现在数据传递上:如果请求方式为GET方式,则可以在请求的URL地址后以?的形式带上交给服务器的数据,多个数据之间以&进行分隔,例如:GET /mail/1.html?name=abc&password=xyz HTTP/1.1 GET方式的特点:在URL地址后附带的参数是有限制的,其数据容量通常不能超过1K。 如果请求方式为POST方式,则可以在请求的实体内容中向服务器发送数据,Post方式的特点:传送的数据量无限制。
消息头
accept
:浏览器通过这个头告诉服务器,它所支持的数据类型Accept-Charset
: 浏览器通过这个头告诉服务器,它支持哪种字符集Accept-Encoding
:浏览器通过这个头告诉服务器,支持的压缩格式Accept-Language
:浏览器通过这个头告诉服务器,它的语言环境Host
:浏览器通过这个头告诉服务器,想访问哪台主机If-Modified-Since
: 浏览器通过这个头告诉服务器,缓存数据的时间Referer
:浏览器通过这个头告诉服务器,客户机是哪个页面来的 防盗链Connection
:浏览器通过这个头告诉服务器,请求完后是断开链接还是何持链接http响应
一个HTTP响应代表服务器向客户端回送的数据,它包括: 一个状态行、若干消息头、以及实体内容 。
状态行
状态行格式: HTTP版本号 状态码 原因叙述
响应头
HTTP响应中的常用响应头(消息头)
Location
: 服务器通过这个头,来告诉浏览器跳到哪里Server
:服务器通过这个头,告诉浏览器服务器的型号Content-Encoding
:服务器通过这个头,告诉浏览器,数据的压缩格式Content-Length
: 服务器通过这个头,告诉浏览器回送数据的长度Content-Language
: 服务器通过这个头,告诉浏览器语言环境Content-Type
:服务器通过这个头,告诉浏览器回送数据的类型Refresh
:服务器通过这个头,告诉浏览器定时刷新Content-Disposition
: 服务器通过这个头,告诉浏览器以下载方式打数据Transfer-Encoding
:服务器通过这个头,告诉浏览器数据是以分块方式回送的Expires
: -1 控制浏览器不要缓存Cache-Control
: no-cachePragma
: no-cache通过设置响应头控制浏览器的行为
1. 设置location,请求重定向
2. 设置Content-Encoding响应头,告诉浏览器数据的压缩格式
3. 设置content-type响应头,指定回送数据类型
4. 设置refresh响应头,让浏览器定时刷新
5. 设置content-disposition响应头,让浏览器下载文件
ContentDispositionDemo
:ContentEncodingDemo
:ContentTypeDemo
:LocationDemo
:RefreshDemo
:参考:https://www.cnblogs.com/xdp-gacl/category/574705.html