一、Http协议
什么是协议
:网络通信中,数据以固定的格式传输数据.HTTP协议
:超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。
简而言之:浏览器和服务器数据交换固定的格式。
请求协议:浏览器将数据以请求格式发送到服务器。
响应协议:服务器将数据以响应格式返回给浏览器。
1、什么是HTTP协议
HTTP协议,全称”超文本传输协议(HyperText Transfer Protocol)”是互联网上应用最为广泛的一种网络协议。简而言之,就是一种在web中传输数据的格式。
2、HTTP协议的特点
\1. 基于请求/响应模型的协议。请求和响应必须成对,先有请求后有响应。
浏览器是通过请求协议将数据传递到服务器,浏览器访问服务器几种方式: (了解一下),其中掌握的就是get和post方式,下面我们使用抓包工具来分析get和post请求有何不同。
请求方式 | 请求说明 |
---|---|
OPTIONS | 返回服务器针对特定资源所支持的HTTP请求方法。也可以利用向Web服务器发送’*’的请求来测试服务器的功能性。 |
HEAD | 向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息 |
GET | 向特定的资源发出请求(a href=”servlet”标签/js location.href=”servlet”) |
POST | 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的创建和/或已有资源的修改 |
PUT | 向指定资源位置上传其最新内容 |
DELETE | 请求服务器删除Request-URI所标识的资源 |
TRACE | 回显服务器收到的请求,主要用于测试或诊断 |
CONNECT | HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器 |
虽然HTTP的请求方式有8种,但是我们在实际应用中常用的也就是get和post,其他请求方式也都可以通过这两种方式间接的来实现。
重点掌握:get/post
3、HTTP协议的结构
HTTP协议的结构包括两部分:请求报文,响应报文;
- 请求报文:浏览器给服务器发送的请求数据的格式。请求报文主要包括:请求行 ,请求头 ,请求体 。
- 响应报文:服务器给客户端(浏览器)响应的报数据格式。响应报文主要包括:响应行 ,响应头 ,响应体 ;
4、浏览器抓包观察请求报文
浏览器可以抓取请求的数据,但是现在的浏览器都对请求的参数在格式上进行了优化。如果想要看到原始的请求报文,需要使用到工具。使用Fiddler这个工具对请求数据进行抓取分析。
请求报文分析
【请求行】
请求行位于请求报文的第一行,由:请求方式 url 协议/版本 组成
POST http://localhost:63342/web/web/requestTest.html HTTP/1.1
【请求头】
位于请求行的下面,以键值对 的形式给服务器传递信息,有些请求头信息是非必须的。
Host: localhost:63342
Connection: keep-aliv
Content-Length: 25
Cookie: JSESSIONID=AEE81E76BF586D353D84886D9B5E0BFD;
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36
【常用的请求头】:
请求头 示例 说明
User-Agent User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) 浏览器携带的用户操作系统,浏览器版本等信息
【请求体】
get请求请求体为空;post请求的请求体传递请求参数 。注意,请求体与请求头之间有一个空行。
userName=zhangsan&pwd=123
5、HTTP协议小结
1. HTTP:超文本传输协议,定义了浏览器与服务器之间数据传输的格式;
2. HTTP协议组成:
1. 请求报文:请求行,请求头,请求体;
1. 请求行:请求报文中的第一行数据,包括**请求方式**,**URL** ,**协议/版本** ;
2. 请求头:以键值对的数据格式,给服务器传输数据。常用的请求头:user-agent,cookie;
3. 请求体:get请求:没有请求体;post请求:请求体传递请求参数;
2. 响应报文:响应行,响应头,响应体;
GET和POST请求区别
GET请求:请求行直接传递请求参数
将请求参数追加在URL后面,不安全。例如:form.html?username=jack&username=1234
URL长度限制GET请求方式的数据大小,不可以传输数据量较大或者非文本数据
请求体里面没有内容
POST请求
请求参数以请求体形式发送给服务器,数据传输安全
请求数据可以为非文本数据,可以传输数据量较大的数据
只有表单设置为method=”post”才是post请求.其他的都是get请求
常见GET请求:地址栏直接访问、<a href=””>、<img src=””> 等
浏览器和服务器是以固定的格式进行通信的,采取的HTTP协议的请求协议。浏览器通过请求协议,将数据传送到服务器中。
二、request&请求数据获取
1,获取请求行信息
方法 | 说明 |
---|---|
String getMethod() | 获取请求方式的类型 |
StringBuffer getRequestURL() | 获取客户端发出请求完整URL |
String getRemoteAddr() | 获取IP地址 |
String getProtocol() | 获取当前协议的名称和版本 |
2.获取请求头信息
方法 | 作用 |
---|---|
String getHeader(String name) | 根据请求头的k关键字获取请求头信息 |
Enumeration getHeaderNames() | 返回此请求包含的所有头信息的枚举 |
扩展:K关键字如下
请求头key | 请求头value |
---|---|
referer | 浏览器通知服务器,当前请求来自何处,如果是直接访问,则不会有这个头。常用于:防盗链 |
If-modified-Since | 浏览器通知服务器,本地缓存的最后变更时间。与另一个响应头组合控制浏览器页面的缓存。 |
cookie | 与会话有关技术,用于存放浏览器缓存的cookie信息。 |
user‐agent | 浏览器通知服务器,客户端浏览器与操作系统相关信息 |
connection | 保持连接状态。Keep-Alive 连接中,close 已关闭 |
host | 请求的服务器主机名 |
content-length | 请求体的长度 |
content-type | 如果是POST请求,会有这个头,默认值为application/x-www-form-urlencoded,表示请求体内容使用url编码 |
accept | 浏览器可支持的MIME类型。文件类型的一种描述方式。 |
mime格式 | 浏览器请求数据的类型,例如: text/html ,html文件 text/css,css文件 text/javascript,js文件 image/*,所有图片文件 |
accept-encoding | 浏览器通知服务器,浏览器支持的数据压缩格式。如:GZIP压缩 |
accept-language | 浏览器通知服务器,浏览器支持的语言。各国语言(国际化i18n) |
…. | ….. |
3.请求体中获取请求参数的方法
方法名 | 描述 |
---|---|
String getParameter(String name) | getParameter获得指定参数名对应的值。如果没有返回null,如果只有多个获得第一个。 例如:username=jack |
String[] getParameterValues(name) | getParameterValues[] 获取请求数据key相同的多个数据 |
request.getParameterMap(); | 获得所有表单的数据 |
三、request作用域
1、request的声明周期
一次请求和响应的完整流程
1.浏览器向servlet发送请求
2.tomcat收到请求后,创建Request和Response两个对象,并将请求数据封装到request对象中,然后传递给servlet
3.Servlet收到请求后,调用doget和dopost方法,处理浏览器的请求信息,然后通过Response返回信息
4.tomcat接受到返回的信息,返回给浏览器
5.浏览器接收到返回信息后,tomcat销毁Request和Response两个对象,同时销毁这两个对象所获得的信息
创建:浏览器给服务器发送请求后,tomcat创建request对象封装请求数据;
销毁:服务器给浏览器响应信息结束后销毁;
特点:浏览器每次给服务器发送请求,服务器都会为这次请求创建一个request对象
2.request域对象
request域对象,一个存储数据的区域对象,是把request当成一个容器存储数据,request域存储数据主要是用于在两个servlet之间传递数据。request作为域对象,常用的方法如下:
方法 | 说明 |
---|---|
void setAttribute(String name, Object o) | 往request域中设置值 |
Object getAttribute(String name) | 从request域中取值 |
void removeAttribute(String name) | 从request域中移除值 |
【注意】getParameter()方法和getAttribute()方法的区别
getParameter()方法获取的是浏览器提交的数据(多是表单提交的数据);getAttribute()方法获取的是request域中的数据(通过request.setAttribute()设置的值);
3.请求转发
方法 | 说明 |
---|---|
RequestDispatcher getRequestDispatcher(String path) | 获取请求转发器(request对象方法) |
void forward(ServletRequest request, ServletResponse response) | 将请求转发到另一个资源(Servlet)上 |
【小结】转发
- 转发是服务器内部的跳转行为;
- 从一个Servlet转发到另一个资源(静态或动态),能够实现跳转,但是浏览器地址栏地址没有发生改变。因为对浏览器来说本质上就只有一次请求;
- 请求转发的作用:共享request域中的数据;