HTTP协议(Requset、Response)
目录
http协议
对浏览器客户端 和 服务器端 之间数据传输的格式规范。
基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)
无状态, 但是可用cookie技术在请求和响应报文中写入cookie信息来控制客户端的状态。
连接步骤:
域名解析 --> 发起TCP的3次握手 --> 建立TCP连接后发起http请求 --> 服务器返回http响应,浏览器得到html代码 --> 浏览器解析html代码,并请求html代码中的资源(如js、css、图片等) --> 浏览器对页面进行渲染呈现给用户
查看http协议报文的方法:
- 使用火狐的firebug插件(右键->firebug->网络)
- 使用谷歌的“审查元素”
- 使用系统自带的telnet工具(远程访问工具)
a)telnet localhost 8080 访问tomcat服务器
b)ctrl+] 回车 可以看到回显
c)输入请求内容d)回车,即可查看到服务器响应信息
http报文解析:
requset请求 数据格式
Http请求报文(浏览器->服务器)
- 例:表单提交
- <form action="提交地址" method="GET/POST">
- 用户名:<input type="text" name="username"><br>
- 密码:<input type="text" name="password"><br>
- <input type="submit" value="登录"/>
- <form>
点击登陆后查看HTTP报文:
- 截取http请求报文分析:
- GET /WebRoot/hello HTTP/1.1 -- 请求行
- Host: localhost:8080 -- 请求头(多个key-value对象)
- User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0
- Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
- Accept-Language: zh-cn,en-us;q=0.8,zh;q=0.5,en;q=0.3
- Accept-Encoding: gzip, deflate
- Connection: keep-alive
- -- 一个空行
- username=123&password=123456 --(post)请求正文/实体内容
----------------------------------------------------------------------------请求行-----------------------------------------------------------------------------------
GET /WebRoot/hello HTTP/1.1
开始访问资源请求一次,之后文件中每有一个地址都会请求一次
#http协议版本
http1.0:当前浏览器客户端与服务器端建立连接之后,只能发送一次请求,一次请求之后连接关闭。
http1.1:默认使用长连接,当前浏览器客户端与服务器端建立连接之后,可以在一次连接中发送多次请求。(基本都使用1.1)
#请求资源
URL: 统一资源定位符。http://localhost:8080/WebRoot/hello。只能定位互联网资源。是URI 的子集。URL=协议+主机端口+URI
URI: 统一资源标记符。/WebRoot/hello。用于标记任何资源。可以是本地文件系统、局域网的资源、 可以是互联网资源。
#请求方式
常见的请求方式: GET 、 POST、 HEAD、 TRACE、 PUT、 CONNECT 、DELETE
常用的请求方式: GET 和 POST
GET(获取资源)
- GET方法用来查询,不会对浏览器上的信息产生影响
- 参数数据跟在地址栏(URI)后。以?开头、多个参数之间以&分割:GET /WebRoot/testMethod.html?name=123&password=123456 HTTP/1.1
- GET提交参数数据有限制,不超过1KB。(实际上URL不存在参数上限的问题,HTTP协议规范没有对URL长度进行限制。这个限制是特定的浏览器及服务器对它的限制,IE对URL长度的限制是2083字节)
- GET方式采用的是明文传输,不适合提交敏感密码。
- 注意: 浏览器直接访问的请求,默认提交方式是GET方式。火狐浏览器以Get方式提交带参数的数据,会重复提交两次
POST(传输实体主体)
- 参数跟在请求的实体内容中。没有?开头、多个参数之间以&分割
- POST提交的参数数据没有限制。
- POST方式放在报文内部无法看到,适合提交敏感数据。
------------------------------------------------------------------------------请求头---------------------------------------------------------------------------
键值对,例:常见的请求头
Accept: text/html,image/* -- 浏览器接受的内容类型
Accept-Charset: ISO-8859-1 -- 浏览器接受的编码格式
Accept-Encoding: gzip,compress --浏览器接受的数据压缩格式
Accept-Language: en-us,zh- --浏览器接受的语言
Host: www.it315.org:80 --(必输)当前请求域名(主机:端口)
Content-Type: application/x-www-form-urlencoded --提交的数据类型
If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT --浏览器最后的缓存时间
Referer: http://www.it315.org/index.jsp -- 当前请求来自于哪里(可用来判断非法链接)
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0) --浏览器版本类型
Cookie:name=123 -- 浏览器保存的cookie信息
Connection: close/Keep-Alive -- 浏览器跟服务器连接状态。close:连接关闭 keep-alive:保持连接
Date: Tue, 11 Jul 2000 18:23:51 GMT -- 请求发出的时间
Content-Type 常见的媒体格式类型如下:
text/html : HTML格式
text/plain :纯文本格式
text/xml : XML格式
text/x-markdown:markdown格式
image/gif :gif图片格式
image/jpeg :jpg图片格式
image/png:png图片格式application/xhtml+xml :XHTML格式
application/xml : XML数据格式
application/atom+xml :Atom XML聚合格式
application/json : JSON数据格式
application/pdf :pdf格式
application/msword : Word文档格式
application/octet-stream : 二进制流数据(如常见的文件下载)
application/x-www-form-urlencoded :<form encType="">
中默认的encType(表单默认的提交数据的格式)form表单数据被编码以键值对形式?key1=value1&key2=value2的方式发送到服务器
-----------------------------------------------------------------------------空行-------------------------------------------------------------------------------
--------------------------------------------------------------------请求正文/实体内容-------------------------------------------------------------------------
请求头和请求正文之间是一个空行,它表示请求头已经结束,接下来的是请求正文。
只有POST提交的参数会放到实体内容中
- username=123&password=123456 --(post)请求正文/实体内容
=======================================Servlet请求对象============================================
HttpServletRequest对象:
tomcat服务器把请求信息封装到HttpServletRequest对象,把响应信息封装到HttpServletResponse对象。然后调用servlet的方法,传入request和response对象
HttpServletRequest对象用于获取请求数据,核心的API:
请求行:
request.getMethod(); 获取请求方式
request.getRequetURI(); / request.getRequetURL(); 获取请求资源
request.getProtocol(); 获取请求http协议版本
request.getQueryString(); (获取GET方式传递的参数)
请求头:
request.getHeaderNames(); 获取所有的请求头名称
request.getHeader("名称"); 根据请求头获取请求值
实体内容:
request.getInputStream(); 获取实体内容数据(获取POST方式传递的参数)
GET、POST请求参数 统一通用方便的获取方法:
request.getParameterNames(); 获取所有参数名称列表(参数名为 html表单中数据标签的name属性值)
request.getParameter("参数名"); 根据参数名获取参数值(只能获取一个值的参数)
request.getParameterValue("参数名“); 根据参数名获取参数值(可以获取多个值的参数)
编码问题:
修改GET方式参数编码:
手动解码:String name = new String(request.getParameter("参数名").getBytes("iso-8859-1"),"utf-8");
修改POST方式参数编码:
设置参数查询码表:request.setCharacterEncoding("utf-8"); 放在查询参数之前,只对实体内容起作用
改服务器配置文件:找到并在%tomcat%/conf/server.xml文件Connector标签中加入 URIEncoding="utf-8"
请求案例:获取浏览器的类型(user-agent), 防止非法链接(referer)
response响应 数据格式
Http响应报文(服务器->浏览器)
- HTTP/1.1 200 OK --响应行
- Server: Apache-Coyote/1.1 --响应头(key-vaule)
- Content-Length: 24
- Date: Fri, 30 Jan 2015 01:54:57 GMT
- --一个空行
- this is hello servlet!!! --响应正文/实体内容
-------------------------------------------------------------------------------响应行---------------------------------------------------------------------------
HTTP/1.1 200 OK
#状态码: 服务器处理请求的结果(状态)
常见的状态:
200: 表示请求处理完成并完美返回
302: 表示请求需要进一步细化。
404: 表示客户访问的资源找不到。
500: 表示服务器的资源发送错误。(服务器内部错误)
#状态描述
--------------------------------------------------------------------------------响应头------------------------------------------------------------------------
键值对,例:常见的响应头
Location: 重定向地址 --表示重定向的地址,该头和302的状态码一起使用。
Server:apache tomcat --表示服务器的软件信息, 它和请求报头域User-Agent是相对应的
Content-Encoding: gzip --表示服务器发送给浏览器的数据压缩类型
Content-Length: 80 --表示服务器发送给浏览器的实体正文长度
Content-Language: zh-cn --表示服务器支持的语言
Content-Type: text/html; charset=GB2312 --表示服务器发送给浏览器的数据类型及内容编码
Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT --表示服务器资源的最后修改时间
Refresh: 秒数;url=地址 --表示定时刷新到指定页面
Content-Disposition: attachment; filename=aaa.zip --表示告诉浏览器以下载方式打开资源(下载文件时用到)
Transfer-Encoding: chunked
Set-Cookie:SS=Q0=5Lb_nQ; path=/search --表示服务器发送给浏览器的cookie信息(会话管理用到)
Expires: -1 --响应过期时间,-1表示通知浏览器不进行缓存
Cache-Control: no-cache --同上
Pragma: no-cache --同上
Connection: close/Keep-Alive --表示服务器和浏览器的连接状态。close:关闭连接 keep-alive:保存连接
-----------------------------------------------------------------------响应正文/实体内容---------------------------------------------------------------------
响应正文就是服务器返回给浏览器的资源的内容:html, css, js,甚至图片
由响应头的Content-···等属性告知浏览器 响应正文的长度、编码、媒体类型等(MIME Type是经过 ietf 组织协商,以 RFC 的形式作为建议标准发布在网上的)
由response对象PrintWriter写入数据内容
=======================================Servlet响应对象============================================
HttpServletResponse对象:
tomcat服务器把请求信息封装到HttpServletRequest对象,把响应信息封装到HttpServletResponse对象。然后调用servlet的方法,传入request和response对象
HttpServletResponse对象用于修改响应信息,核心的API:
响应行:
response.setStatus(); 设置状态码
响应头:
response.setHeader("name","value"); 设置响应头
response.sendRedirect(url); 重定向
response.setContentType("text/html;charset=utf-8"); 发送给浏览器的数据类型 及内容编码
实体内容:(浏览器直接能够看到)
response.getWriter().writer(); 发送字符实体内容
response.getOutputStream().writer() 发送字节实体内容
tomcat服务器把response对象的内容转换成响应格式内容,再发送给浏览器解析。
编码问题:
response.setCharacterEncoding("utf-8"); 放在响应实体内容代码之前,对getOutputStream().writer()字节流不起作用
响应案例:请求重定向(Location),定时刷新(refresh),content-Type数据类型(在tomcat服务器web.xml中用mime-type标签规定了数据类型,例如:text/html发送HTML文本;image/jpg发送图片)
HTTPS协议 是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全
HTTP协议(Requset、Response)的更多相关文章
- Servlet(2):Requset/Response Encoding and Filter
Requset/Response Encoding 表单提交分GET和POST,接下来分开讨论. (1)GET/URL提交的数据 在 Tomcat中,默认情况下使用"URIEncoding& ...
- jsp response对象
所属接口:javax.servlet.http.HttpServletResponse,其父接口是ServletResponse,而且 ServletResponse也现在只有唯一一个HttpServ ...
- Jsp中response对象的所有属性
所属接口:javax.servlet.http.HttpServletResponse,其父接口是ServletResponse,而且ServletResponse也现在只有唯一一个HttpServl ...
- web前端利用HSTS(新的Web安全协议HTTP Strict Transport Security)漏洞的超级Cookie(HSTS Super Cookie)
web前端如果想实现cookie跨站点,跨浏览器,清除浏览器cookie该cookie也不会被删除这似乎有点难,下面的教程让你完全摆脱document.cookie 1.服务器端设置HSTS 如PHP ...
- request与response对象.
request与response对象. 1. request代表请求对象 response代表的响应对象. 学习它们我们可以操作http请求与响应. 2.request,response体系结构. 在 ...
- request与response对象详述
request与response对象. 1. request代表请求对象 response代表的响应对象. 学习它们我们可以操作http请求与响应. 2.request,response体系结构. 在 ...
- Python爬虫基础知识入门一
一.什么是爬虫,爬虫能做什么 爬虫,即网络爬虫,大家可以理解为在网络上爬行的一直蜘蛛,互联网就比作一张大网,而爬虫便是在这张网上爬来爬去的蜘蛛咯,如果它遇到资源,那么它就会抓取下来.比如它在抓取一个网 ...
- OkHttp3 简述
- JSP九大内置对象与Servlet学习笔记[转]
我们常说的JSP有九大内置对象分别为:request.response.session.out.pagecontext.page.exception.application.config. 我们知道, ...
- [爬虫]Python爬虫基础
一.什么是爬虫,爬虫能做什么 爬虫,即网络爬虫,大家可以理解为在网络上爬行的一直蜘蛛,互联网就比作一张大网,而爬虫便是在这张网上爬来爬去的蜘蛛咯,如果它遇到资源,那么它就会抓取下来.比如它在抓取一个网 ...
随机推荐
- Android2.2+opencv3.1配置实现
来实习什么都要自己干,不仅仅要写算法,还要再Android上面跑起来.... 弄了三天才搞好,就因为一点点失误!!! 第一步:安装Android Studio2.2 安装opencv3.1 下载 ...
- glibc -The GNU C Library
1.使用库文件 1.1.头文件 C库实际包含两部分:头文件,实际的库文件.头文件定义类型.定义宏.声明变量.声明函数.头文件定义的内容实际在库文件中实现.需要使用到 C库 的某些功能时,程序源文件包含 ...
- eclipse添加缺失的包/src/main/resource
右键>>build path>>source 添加文件夹
- IntelliJ IDEA 快捷键积累
Windows idea 平时常用快捷键 一.视图查看 Ctrl+F12 查看file,method结构图.类继承机构图(方法,参数,返回值) Ctrl+shift+Al ...
- smfony
1.smfony设置量表之间的关系 2.smyfony2-curd-数据库创建 3.smyfony2 增删改查 4. 5. 6.
- NAS 百科 —— http://baike.baidu.com/item/NAS%E7%BD%91%E7%BB%9C%E5%AD%98%E5%82%A8
NAS(Network Attached Storage)网络存储基于标准网络协议实现数据传输,为网络中的Windows / Linux / Mac OS 等各种不同操作系统的计算机提供文件共享和数据 ...
- java double 保留x位小数
以下是保留两位的例子 public class Test1 { public static void main(String[] args) { double a = 123450; double d ...
- 白鹭引擎 - 显示对象与 HelloWord ( 绘制了一个红蓝相间的 2 x 2 格子 )
1: 白鹭引擎默认实在一个 640 * 1136 的画布上作画 2: 入口文件 Main.ts, 类 Main 是程序的入口 // 1, 在一个宽高为 640 * 1136 的画布上作画 // 2, ...
- [转]使用Ubuntu Live CD修复Grub引导教程
这个教程的方法我用过了,能够解决了我的问题. 这篇文章主要介绍了使用Ubuntu Live CD修复Grub引导教程,本文以 Ubuntu Live CD 修复 Grub 引导为例,需要的朋友可以参考 ...
- VSFTP 配置虚拟用户
虚拟用户的特点是只能访问服务器为其提供的FTP服务,而不能访问系统的其它资源.所以,如果想让用户对FTP服务器站内具有写权限,但又不允许访问系统其它资源,可以使用虚拟用户来提高系统的安全性. 在VSF ...