您的位置:首页 > 理论基础 > 计算机网络

http协议详解

2016-03-16 11:02 148 查看

http协议定义

协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则,超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器,目前我们使用的是HTTP/1.1 版本。

URL

URL(Uniform Resource Locator) 地址用于描述一个网络上的资源,基本格式如下:

schema://host[:port#]/path/.../[;url-params][?query-string][#anchor]


- scheme 指定低层使用的协议(例如:http, https, ftp)

- host 指HTTP服务器的IP地址或者域名

- port# HTTP服务器的默认端口是80,这种情况下端口号可以省略。如果使用了别的端口,必须指明,例如 http://www.cnblogs.com:8080/

- path 访问资源的路径

- url-params,query-string 发送给http服务器的数据

- anchor 锚

http是无状态的

http协议是无状态的,同一个客户端的这次请求和上次请求是没有对应关系,对http服务器来说,它并不知道这两个请求来自同一个客户端。为了解决这个问题,Web程序引入了Cookie机制来维护状态。

Get和Post的区别

GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.aspx?name=test1&id=123456. POST方法是把提交的数据放在HTTP包的Body中

GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制

GET方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码

http请求

http请求由三部分组成,分别是:请求行消息报头header请求正文body

1.请求行

请求方法+统一资源标识符+http协议版本


当用get方法时,boby中无内容。

2.消息报头

request.getHeader("报头名")
就可以获取报头信息。

Accept

Accept请求报头域用于指定客户端接受哪些类型的信息。eg:Accept:image/gif,表明客户端希望接受GIF图象格式的资源;Accept:text/html,表明客户端希望接受html文本。

Accept-Charset

Accept-Charset请求报头域用于指定客户端接受的字符集。eg:Accept-Charset:iso-8859-1,gb2312.如果在请求消息中没有设置这个域,缺省是任何字符集都可以接受。

Accept-Encoding

Accept-Encoding请求报头域类似于Accept,但是它是用于指定可接受的内容编码。eg:Accept-Encoding:gzip.deflate.如果请求消息中没有设置这个域服务器假定客户端对各种内容编码都可以接受。

Accept-Language

Accept-Language请求报头域类似于Accept,但是它是用于指定一种自然语言。eg:Accept-Language:zh-cn.如果请求消息中没有设置这个报头域,服务器假定客户端对各种语言都可以接受。

Host

Host请求报头域主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的,eg:

我们在浏览器中输入:
http://www.bupt.edu.cn/index.html


浏览器发送的请求消息中,就会包含Host请求报头域,如下:

Host:www.bupt.edu.cn


此处使用缺省端口号80,若指定了端口号,则变成:
Host:www.bupt.edu.cn:指定端口号


User-Agent

服务器应用程序就是从User-Agent这个请求报头域中获取操作系统和浏览器的名称和版本。User-Agent请求报头域允许客户端将它的操作系统、浏览器和其它属性告诉服务器。不过,这个报头域不是必需的,如果我们自己编写一个浏览器,不使用User-Agent请求报头域,那么服务器端就无法得知我们的信息了。

Date

普通报头域表示消息产生的日期和时间。

Connection

普通报头域允许发送指定连接的选项。例如指定连接是连续“keep-alive”,或者指定“close”选项,通知服务器,在响应完成后,关闭连接。

Referer

提供了Request的上下文信息的服务器,告诉服务器我是从哪个链接过来的。

用于防盗链的例子:

Github地址:防盗链

String referer=request.getHeader("Referer");
if(referer==null||!referer.startsWith("http://localhost:8080/servletProject")){
response.sendRedirect("/servletProject/Error");
return;
}


Cookie

将cookie的值发送给服务器

http响应

HTTP响应也是由三个部分组成,分别是:状态行消息报头响应正文

1.状态行

服务器HTTP协议的版本+服务器发回的响应状态代码+状态代码的文本描述


常用的状态码与文本描述:

response.setStatus(302);


response.setHeader("Location", "/servletPro/Servlet2");


response.sendRedirect("/servletPro/Servlet2");
相同

200 OK //客户端请求成功

302 //请求资源,服务器让浏览器转向某外资源

400 Bad Request //客户端请求有语法错误,不能被服务器所理解

403 Forbidden //服务器收到请求,但是拒绝提供服务

404 Not Found //请求资源不存在,eg:输入了错误的URL

500 Internal Server Error //服务器发生不可预期的错误

503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常

2.消息报头

response.setHeader("报头名","内容")
来设置回送

response.setContentType("text/html;charset=utf-8")
设置回送内容样式

response.setStatus()
设置状态码

response.setCharacterEncoding("utf-8")


具体代码请参考:

Github地址:设置响应报头

Location

用于重定向接受者到一个新的位置。Location响应报头域常用在更换域名的时候。

Server

包含了服务器用来处理请求的软件信息。

Content-Encoding、Content-Length、Content-Language

关于回送的字节信息

Content-Type

Content-Type实体报头域用语指明发送给接收者的实体正文的媒体类型。eg:

Content-Type:text/html;charset=ISO-8859-1


Content-Type:text/html;charset=GB2312


Last-Modified

Last-Modified实体报头域用于指示资源的最后修改日期和时间。

Refresh

设置过多久刷新到此URL。

定时刷新:

response.setHeader("Refresh", "5;url=/servletProject2/ResponseTest");


Content-Disposition

告诉浏览器有文件要下载。

response.setHeader("Content-Disposition", "attachment;filename="+文件);


文件下载例子:

Github地址:文件下载 先把资源读到servlet当中,再写给浏览器

set-cookie

为浏览器设置cookie。

Expires、Cache-control、Pragrma

告诉浏览器如何缓存

//不缓存
response.setDateHeader("Expires", -1);
response.setHeader("Cache-Control","no-cache");
response.setHeader("Pragma","no-cache");
//缓存一个小时
response.setDateHeader("Expires", System.currentTimeMillis()+3600*1000*24);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: