HTTP协议学习篇(一)—http请求

HTTP协议,超文本传输协议,是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统,是一个基于请求与响应模式的、无状态的、应用层的协议,常基于TCP的连接方式,HTTP1.1版本中给出一种持续连接的机制,绝大多数的Web开发,都是在HTTP协议之上的Web应用。。它于1990年提出,不断得到完善和发展。

HTTP 1.0版本与HTTP 1.1版本的不同:
HTTP 1.0版本中,客户端与web服务器建立连接后,只能获得一个web资源;HTTP 1.0是链接之后,马上断开;
HTTP 1.1协议中,允许客户端与web服务器建立连接后,在一个连接上获取对个web资源。HTTP 1.1协议是链接之后,不会马上断开,还可以继续操作,一段时间不操作后,会自动断开。

HTTP协议的主要特点可概括如下:
1,支持客户/服务模式;
2,简单快速:客户向服务器请求服务时,只需要传送请求方法和路径。请求的方法常用的有GET,POST,HEAD,OPTIONS,DELETE,TRACE,PUT,CONNECT,每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP协议服务器的程序规模小,因为通信速度很快;
3,灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记;
4,无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户请求,并收到客户的应答后,即断开连接,采用这种方式可以节省传输的时间;
5,无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

HTTP URL:URL是一种特殊类型的URI,包含了用于查找某个资源的足够信息,URL的格式如下:http://host[":"port][abs_path]
http表示要通过HTTP协议来定位的网络资源;
host:表示合法的Internet主机域名或者IP地址;
port:指定一个端口号,为空则使用缺省端口80;
abs_path:指定请求资源的URI,如果URL中没有给出abs_path,那么当它作为请求URI时,必须以”/”的形式给出,通常这个工作浏览器会自动帮我们完成。
例如:输入:www.xidian.edu.cn,浏览器自动转成:http://www.xidian.edu.cn

http请求的组成部分:由三部分组成,分别为:请求行,消息报文,请求正文
1,请求行:以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本,格式如下:Method Request-URI HTTP-Version CRLF(其中,Method表示请求方法;Request-URI是一个同一资源标识符;HTTP-Version表示请求的HTTP协议的版本;CRLF表示回车和换行,除了作为结尾的CRLF外,不允许出现单独的CR或LF字符。)
例如:GET /day4/img.html HTTP/1.1 分为三个部分:请求方式、资源路径、协议版本

其中请求方法(所有的请求方法为大写)有8种(用户如没有设置,默认情况下浏览器向服务器发送的都是get请求,例如在浏览器直接输地址访问,点超链接访问等都是get,用户如想把请求方式改为post,可通过更改表单的提交方式实现),各个方法的解释如下:
GET:请求获取Request-URI所标识的资源;
POST:在Request-URI所标识的资源后附加新的数据;
HEAD:请求获取由Request-URI所标识的资源的响应消息报头;
PUT:请求服务器存储一个资源,并用Request-URI作为其标识;
DELETE:请求服务器删除Request-URI所标识的资源;
TRACE:请求服务器回送收到的请求信息,主要用于测试或诊断;
CONNECT:保留将来使用;
OPTIONS:请求查询服务器性能,或者查询与资源相关的选项和需求

不管POST或GET,都用于向服务器请求某个WEB资源,这两种方式的区别主要表现在数据传递上:
如请求方式为GET方式,则可以在请求的URL地址后以?的形式带上交给服务器的数据,多个数据之间以&进行分隔,例如:
GET /mail/1.html?name=abc&password=xyz HTTP/1.1
GET方式的特点:在URL地址后附带的参数是有限制的,其数据容量通常不能超过1K。
如请求方式为POST方式,则可以在请求的实体内容中向服务器发送数据,Post方式的特点:传送的数据量无限制。
GET和POST区别?
1) 区分哪些是GET请求? 哪些POST请求?
GET:在浏览器直接输入URL、
POST:
2) GET请求数据位于请求行中 ,POST请求数据位于请求体中
GET /day4/form.html?username=zhangsan HTTP/1.1
POST /day4/form.html HTTP/1.1

username=lisi
3) GET请求数据在URL上显示,所有有长度限制,通常是1kb
4)GET方式说明网站的安全界别较低,POST安全级别较高;

HEAD方法:与GET方法几乎是一样的,对于HEAD请求的回应部分来说,它的HTTP头部中包含的信息与通过GET请求所得到的信息是相同的。利用这个方法,不必传输整个资源内容,就可以得到Request-URI所标识的资源的信息。该方法常用于测试超链接的有效性,是否可以访问,以及最近是否更新。

2,请求头:用于描述客户端请求哪台主机,以及客户端的一些环境信息等(请求报头允许客户端向服务器端传递请求的附加信息以及客户端自身的信息。)。
http中常用的请求头有:
(1)Accept: text/html,image/* 客户端识别文件类型 (Accept请求报头域用于指定客户端接受哪些类型的信息。eg:Accept:image/gif,表明客户端希望接受GIF图象格式的资源;Accept:text/html,表明客户端希望接受html文本。)
(2)Accept-Charset: ISO-8859-1 客户端字符集(eg:Accept-Charset:iso-8859-1,gb2312.如果在请求消息中没有设置这个域,缺省是任何字符集都可以接受。)
(3)Accept-Encoding: gzip 客户端支持编码类型 gzip 压缩格式 (eg:Accept-Encoding:gzip.deflate.如果请求消息中没有设置这个域服务器假定客户端对各种内容编码都可以接受)
(4)Accept-Language:zh-cn 客户端语言(eg:Accept-Language:zh-cn.如果请求消息中没有设置这个报头域,服务器假定客户端对各种语言都可以接受)
(5)Host: www.itcast.com:80 访问服务器地址(发送请求时,该报头域是必需的,Host请求报头域主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的,eg:我们在浏览器中输入:http://www.xidian.edu.cn/index.html
浏览器发送的请求消息中,就会包含Host请求报头域,如下:Host:www.xidian.edu.cn
此处使用缺省端口号80,若指定了端口号,则变成:Host:www.guet.edu.cn:指定端口号)
(6)If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT 和Last-Modified 一起使用控制缓存
(7)Referer: http://www.xidian.com/index.jsp 代表当前网页的来源 防止盗链
(8)User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0) 浏览器类型(文件下载时,不同浏览器进行不同处理),我们上网登陆论坛的时候,往往会看到一些欢迎信息,其中列出了你的操作系统的名称和版本,你所使用的浏览器的名称和版本,这往往让很多人感到很神奇,实际上,服务器应用程序就是从User-Agent这个请求报头域中获取到这些信息。User-Agent请求报头域允许客户端将它的操作系统、浏览器和其它属性告诉服务器。不过,这个报头域不是必需的,如果我们自己编写一个浏览器,不使用User-Agent请求报头域,那么服务器端就无法得知我们的信息了。
(9)Connection: close/Keep-Alive 请求后连接是关闭还是保持
(10)Date: Tue, 11 Jul 2000 18:23:51 GMT 请求时间
(11)Authorization请求报头域主要用于证明客户端有权查看某个资源。当浏览器访问一个页面时,如果收到服务器的响应代码为401(未授权),可以发送一个包含Authorization请求报头域的请求,要求服务器对其进行验证。
其中对盗链的解释:
盗链:A网站直接通过链接,访问B网站资源。
防盗链原理:判断请求中referer信息

//防盗链
String referer = request.getHeader("referer");
if(referer!=null && referer.equals("http://localhost:8080/day03/index.html")){
// 有效
response.setContentType("text/html;charset=gbk");
response.getWriter().println("手机5600元");
}else{
// 无效
response.setContentType("text/html;charset=gbk");
response.getWriter().println("盗链!");
}
//URL伪造
URL url = new URL("http://localhost:8080/day03/referer");
URLConnection conn =url.openConnection();
conn.setRequestProperty("referer", "http://localhost/day03/index.html");

byte[] buf = new byte[1024];
InputStream is = conn.getInputStream();
int len = is.read(buf);
System.out.println(new String(buf,0,len));

3,请求体:用于封装POST参数列表,多个数据之间用&分隔(name=value&name=value&name=value)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值