HTTP

HTTP

Hyper Text Transfer Protocol 超文本传输协议,作用确定请求和响应的格式,浏览器发送服务器的数据 - 请求报文,服务器返回客户端的数据 - 响应报文

HTTP 基于TCP/IP通信协议来传递数据。

HTTP 基于客户端/服务端(C/S)架构模型,通过一个可靠的链接来交换信息,是一个无状态的请求/响应协议。

请求报文

image-20220121180545694

请求行

​ 包含三个信息 1 请求方式 2 请求URL 3 请求协议

请求消息头

  • Accept 属性告诉服务端 客户端接受什么类型的响应 ( 消息能包含文本、图像、音频、视频以及其他应用程序 专用的数据)

  • Cookie 客户端的Cookie就是通过这个属性传给服务端

    Cookie: $Version=1; Skin=new; jsessionid=5F4771183629C9834F8382E23BE13C4C

    服务端 根据 jsessionid 客户端的多个请求是隶属于一个 Session

  • Referer 表示这个请求是从哪个URL过来的

  • Cache-Control 对缓存进行控制,可以设置响应返回数据在客户端缓存的时间,或者不缓存

    Cache-Control: no-cache 默认设置不缓存

// 获取请求报文中的属性名称  
java.util.Enumeration<java.lang.String>   getHeaderNames();  
  
// 获取指定名称的报文头属性的值  
java.lang.String getHeader(java.lang.String name)   
    
// 获取报文头中的Cookie(读取Cookie的报文头属性)  
Cookie[]   getCookies() ; 

// 获取Seesion 通过 Cookie JSESSIONID属性 可以获取请求关联的 Session
HttpSession getSession()   
  
// 获取客户端本地化信息(读取 Accept-Language 的报文头属性)  
java.util.Locale    getLocale()   
  
// 获取请求报文体的长度(读取Content-Length的报文头属性)  
int getContentLength();  

请求体

  • GET 方式 ,没有请求体,但是有一个 queryString
  • POST 方式,有请求体,form data
  • JSON 方式,有请求体,requet payload

响应报文

image-20220124094347863

image-20220124094455920

**响应状态行 **

协议 / 响应状态码 响应状态

响应消息头

  • Cache-Control 响应输出到客户端后,服务端通过该报文头属告诉客户端如何控制响应内容的缓存

    Cache-Control: max-age=3600 设置让客户端对响应内容缓存3600秒,也即在3600秒内,如果客户再次访问该资源,直接从客户端的缓存中返回内容给客户,不要再从服务端获取;

  • **ETag ** 一个代表响应服务端资源(如页面)版本的报文头属性,如果某个服务端资源发生变化了,这个ETag就会相应发生变化。它是Cache-Control的有益补充,可以让客户端“更智能”地处理什么时候要从服务端取资源,什么时候可以直接从缓存中返回响应;

  • Location 我们在JSP中让页面Redirect到一个某个A页面中,其实是让客户端再发一个请求到A页面,这个需要Redirect到的A页面的URL,其实就是通过响应报文头的Location属性告知客户端的;

  • Set-Cookie 服务端可以设置客户端的Cookie,其原理就是通过这个响应报文头属性实现的 Set-Cookie: UserID=JohnDoe; Max-Age=3600; Version=1

// 添加一个响应报文头属性  
void    setHeader(String name, String value) 
    
// 添加Cookie报文头属性  
void    addCookie(Cookie cookie)   
  
// 不但会设置Location的响应报文头,还会生成303的状态码
void    sendRedirect(String location)  

HTTP 无状态

服务器无法判断这两次请求是同一个客户端发过来的,还是不同的客户端发过来的;

会话跟踪

通过会话跟踪技术来解决无状态的问题,客户端第一次发请求给服务器,服务器获取 session,获取不到,则创建新的,然后响应给客户端,下次客户端给服务器发请求时,会把sessionID带给服务器,那么服务器就能获取到了,那么服务器就判断这一次请求和上次某次请求是同一个客户端,从而能够区分开客户端;

API Explain
request.getSession() 获取当前的会话,没有则创键一个新的会话
request.getSession(true) 效果和不带参数相同
request.getSession(false) 获取当前会话,没有则返回 null
session.getId() 获取 sessionID
session.isNew() 判断当前 session 是否是新的
session.getMaxInactiveInterval() 获取 session 非激活时长,默认 1800 秒(半小时)
session.invalidate() 强制性让会话立即失效
posted @ 2022-03-05 20:38  zrzicu  阅读(64)  评论(0)    收藏  举报