http协议详解
基于请求/响应模式,快速灵活,无状态,支持B/S、C/S的协议
Url结构: http:// ip : 端口 /路径
http请求:分三部分:请求行、消息报头、请求正文。
1、请求行:格式:
Method Request-URI HTTP-Version CRLF
Method: get 获取request-URI标识的资源
Post 在request-URI标识的资源后附加新的数据
Head 请求有request-URI标识的资源的响应消息报头
Put 请求存储一个资源,并用request-URI作为标识
Delete 请求删除一个request-URI所标识资源
Trace 请求服务器回送收到的请求信息,用于测试诊断
Connect 保留字
Options 请求查询服务器的性能,或查询与资源相关的选项和需求
http响应:分三部分:状态行、消息报头、响应正文。
1、状态行格式:
HTTP-Version Status-Code Reason-Phrase CRLF
状态码类别:
1XX:请求已接受,继续处理、
2XX:成功-标识请求已被接受、理解、接受。200//客户端请求成功
3XX:重定向-要完成请求需进一步的操作
4XX:客户端错误-请求语法错误或无法实现
400/ 客户端请求语法错误
401/ 请求未经授权,需和www-authentivate报头域一起使用
404/ 请求资源不存在
5XX:服务端错误-服务器未能实现合法请求
500/ 服务器发送不可预期错误
503/ 服务器当前不能处理客户端请求,一段时间可能恢复
http消息报头(普通报头、请求报头、响应报头、实体报头)
每一个报头域都是由{名字+“:”+空格+值}组成,名字不区分大小写
1、普通报头
普通报头中,有少数报头域用于所有的请求和响应消息,但并不用于被传输的实体,只用于传输的消息。
Cache-Control:用于指定缓存指令,缓存指令是单向的(响应出现的请求未必出现),独立的(一个消息的缓存不会影响另一个消息处理的缓存机制):
请求的缓存指令有:no-cache(用于指示请求或响应消息不能缓存)、no-store、max-age、max-stale、min-fresh、only-if-cached;
响应时的缓存指令包括:public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age、s-maxage.
Date普通报头域
标识消息产生的日期和时间
Connection普通报头域允许发送/指定连接的选项。例如指定连接是连续、或指定“close”选项,通知服务器,在响应完成后,关闭连接。
2、请求报头
请求报头允许客户端向服务器端传递请求的附加信息以及客户端自身的信息。
常用的请求报头
Accept
Accept请求报头域用于指定客户端接受哪些类型的信息。Li:Accept:image/gif,表明希望接受GIF图
Accept-Charset:指定客户端接受的字符集。不设置缺省是任何字符都接受
Accept-Encoding:指定可接受的内容编码。Eg:gzip
Accept-Language:指定一种自然语言。Eg:zh-cn
Authorization:用于证明客户端有权查看某个资源。如果收到服务器响应代码401,可以发送一个包含Authorization请求报头域的请求,要求服务器对其进行验证
Host:指定主机和端口号
User-Agent:获取客户端操作系统和游览器信息
3、响应报头
响应报头允许服务器传递不能放在状态行中的附加响应信息,以及关于服务器的信息和对Request-URI所标识的资源进行下一步访问的信息
常用的响应报头
Location 重定向接受者到新的位置、常用在更换域名的时候
Server 包含服务器用来处理请求的软件信息。与User-Agent对应
WWW-Authenticate 响应报头域必须被包含在401(未授权)响应消息中,客户端收到401响应时,发送Authorization报头域请求服务器对其验证
4、实体报头
请求和响应消息都可以传送一个实体、一个实体由实体报头域和实体正文组成。但并不是说实体报头域和实体正文要一起发送,可以只发送实体报头域。实体报头定义了关于实体正文和请求所标识的资源的元消息。
Content-Type:指示发送给接收者的实体正文的媒体类型;eg:text/html;charset=utf-8;
Content-Encoding:指示已经被应用到实体正文的附加内容的编码。需要获得content-type
所用的类型
Content-language:描述资源所用的自然语言
Last-Modified:指示资源最后修改日期和时间
Expires:指定响应过期的日期和时间。(为了让服务器或游览在一段时间后更新缓存)
重定向和请求转发的区别
一、response.sendRedirect(url)--服务器将新url发送给游览器,游览器再根据新url请求
Request.getRequestDispatcher(url).forward(request,response);请求转发到指定url(服务器内部跳转url然后将结果发给游览器)
二、response.sendRedirect(url)--客户端跳转
Request.getRequestDispatcher(url).forward(request,response)--服务器跳转
三、response.sendRedirect(url)--跳转到指定url地址后,上个页面的请求会结束,request对象会消亡,数据会消亡。
Request.getRequestDispatcher(url).forward(request,response)--内部跳转,request对象一直存在
四、response.sendRedirect(url)--网址会改变
Request.getRequestDispatcher(url).forward(request,response)--以游览器角度来看,他只是发送一个request然后收到一个response,所以url不变
五、response.sendRedirect(url)--传参数需要在url后加参数。
Request.getRequestDispatcher(url).forward(request,response)-传参数可以操作
request对象setAttribute(“name”,value)
六、response.sendRedirect(url)-可以定位到任意的网址
Request.getRequestDispatcher(url).forward(request,response)-只能定位到服务器资源
七、response.sendRedirect(url)--可以重定向有frame的jsp文件
Resquest.getRequestDispatcher(url).forward(request,response)-不可以重定向有frame的jsp文件,可以定向到有frame的html文件,只有在客户端没有输出时才可以调用forward方法,如果当前页面缓冲区不是空的,那么该句可能不起作用,由于这种提交不会改变url地址,刷新会重复提交。