HTTP协议

1 http协议

1.1 概念

是对浏览器和服务器端数据传输格式的规范!

2 Http请求

GET /day08/first HTTP/1.1    --请求行

Host: localhost:8080        --请求头(以键值对形式出现)

User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:37.0) Gecko/20100101 Firefox/37.0

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language: en-GB,en-US;q=0.8,zh-CN;q=0.6,zh;q=0.4,en;q=0.2

Accept-Encoding: gzip, deflate

Connection: keep-alive

                             --一个空行

name=eric&password=123456    --- 实体内容

2.1 请求行

GET /program/first HTTP/1.1

http协议版本:

http1.0: 当浏览器和服务器连接之后,在一次连接中只能发出一个请求

http1.1:当浏览器和服务器连接之后,在一次连接中可以发出多次请求。(效率比1.0更高)

请求方式(提交方式):

http协议中的请求方式:GET、POST、HEAD、PUT、CONNECT。。。。

最常用的的请求方式: GET  和 POST

<form action="提交的地址" method="get/post">

</form>

GET与POST对比

2.2 请求头

Accept:    --浏览器接受的数据类型

Accept-Charset:     --浏览器接受数据编码格式

Accept-Encoding:   --浏览器接受的数据压缩格式

Accept-Language:       ---浏览器接受的语言  

Host:        --请求发出的主机和端口(必须)

If-Modified-Since:   --浏览器缓存的最后修改时间

Referer:  -- 当前请求来自于哪里 (防止非法链接)

User-Agent:   --浏览器的类型

Cookie:            ---浏览器保存的cookie数据

Connection:      ---浏览器和服务器的连接状态。close:关闭。keep-alive:保持连接

Date:  --请求发出的时间

 使用HttpServletRequest获取请求信息

    HttpServletRequest对象:获取请求数据

     请求行:

     请求方式: request.getMethod()

     请求资源: request.getRequestURI() /  request.getRequestURL()

   http协议版本: request.getProtocol();

   请求头

   request.getHeader("name")

   request.getHeaderNames()

   实体内容:

   request.getInputStream();

1)tomcat服务器接收到浏览器发送的请求数据

2)tomcat服务器把请求数据封装成HttpServletRequest对象

3)tomcat服务器调用doGet方法,把request对象传入servlet

4)通过request对象获取请求数据

 结论: service方法和doXXX方法的关系?

   1)service方法是程序的入口。我们的代码逻辑就在这个方法被调用到。

    2)在HttpServlet的service方法源码中,根据不同请求方式调用了不同的doXX方法,

     所以我们在开发servlet的时候,就不需要去覆盖service方法,而是去doXX方法。

       因为get和post是最常用的的两种请求方式,所以只需要覆盖doGet和doPost方法即可!

2.3 案例- user-agent-- 获取浏览器类型

request.getHeader("user-agent");

Firefox  Chrome  Trident

2.4 案例- referer头  --- 防止非法链接

2.5 获取参数数据

get:  放在请求行的URI后面

post: 放在请求的实体内容

reuqest.getParameter("name")  获取一个值的参数

request.getParameterValue("name")  获取多个值的参数

request.getParameterNames() 获取所有参数名称

request.getParameterMap()   获取所有参数对象

解决get乱码问题:

手动解码

if("GET".equals(request.getMethod())){

name = new String(name.getBytes("iso-8859-1"),"utf-8");

}

解决post乱码问题:

request.setCharacterEncoding("utf-8");

上述这句话要放在doPost方法的开始才能生效;1)在使用getParameter方法后在使用上述这代码解决乱码就失效;2)获取实体内容的流后在使用getParameter方法获取不到对象

3 Http响应

HTTP/1.1 200 OK       --响应行

Server: Apache-Coyote/1.1   --响应头

Content-Length: 24

Date: Mon, 08 Jun 2015 01:51:04 GMT

                             --一个空行

                             -实体内容

3.1 响应行

http协议版本

状态码:当前服务器处理请求的状态(结果)

常见的状态码:

200:  请求处理完成,成功返回!

302:  需要浏览器进一步请求,才能完成。

404: 浏览器端的错误。没有找到资源。

500:  服务器端的错误。

状态描述:对状态码的文字补充    

3.2 响应头

Location:  --重定向的地址。结合302状态使用完成重定向的效果

Server:    --服务器的类型

Content-Encoding:     --服务器发送给浏览器的数据压缩格式

Content-Length:         --服务器发送给浏览器的数据长度

Content-Language:    --服务器支持语言

Content-Type:     --服务器发送给浏览器的数据类型和数据编码格式

Last-Modified:    --服务器资源的最后修改时间

Refresh:        ---定时刷新或每隔n秒跳转资源

Content-Disposition:   -- 以下载方式打开资源

Transfer-Encoding:            

Set-Cookie:     -- 服务器发送给浏览器的cookie数据

Expires: -1            --通知浏览器不使用缓存

Cache-Control: no-cache

Pragma: no-cache   

Connection:    连接状态

Date:   响应发出的时间

使用HttpServletResponse修改响应数据

      response.setStatus(404) 设置状态码

      response.setHeader("name","value")  修改响应头

      response.getWriter().append()  以字符形式发送实体内容

      response.getWriter().write()   以字符形式发送实体内容

      response.getOutputStream().write()  以字节形式发送实体内容

请求重定向

1) SetStatus(302)

setHeader(“location”,”/day/1.html”);

2) sendRedirect(“day/1.html”);

定时刷新

1) setHeader(“refresh”,”3”);

2) setHeader("refresh", "3;/day/1.html");在IE11以下的浏览器版本中可能无法实现;

原文地址:https://www.cnblogs.com/lldsgj/p/10801162.html