HTTP协议与Cookie和Session学习笔记

HTTP

HTTP: Hyper Text Transfer Protocol 即超文本传输协议,定义了客户端与服务器端通信时,发送数据的格式。
特点:

  1. 基于TCP/IP的高级协议
  2. 默认端口号为80
  3. 基于请求/响应模型的:一次请求对应一次响应
  4. 无状态的:每次请求之间相互独立,不能交互数据,不保存关于客户的任何信息

http1.0是每次请求都会建立新的连接,现在使用的是http1.0版本,它会复用连接,即客户端向服务器发送请求,连接通道会一直打开。也就是非持续连接与持续连接

请求消息的数据格式

  1. 请求行:由请求方式,请求url,请求协议/版本组成
    请求方式:HTTP协议有7种请求方式,常见的有2种,一个是GET一个是POST。GET和POST的区别:

    GET:

    • 请求参数在请求行中,在url的后面
    • 请求的url长度有限制
    • 不安全

    POST:

    • 请求参数在请求体种
    • 请求的url长度无限制
    • 相对安全
  2. 请求头:客户端的浏览器告诉服务器一些信息,格式为请求头名称:请求头值。常见的请求头有两种

    1. User-Agent:告诉服务器客户端使用浏览器的版本信息
    2. Referer:url,告诉浏览器当前请求从哪来
  3. 请求空行:就是一个空行,用于分割POST请求的请求头和请求体。

  4. 请求体(正文):封装POST请求消息的请求参数,例如:

    POST /login.html	HTTP/1.1
    Host: localhost
    User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0
    Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
    Accept-Encoding: gzip, deflate
    Referer: http://localhost/login.html
    Connection: keep-alive
    Upgrade-Insecure-Requests: 1
    			
    username=zhangsan
    

    第一行就是请求行,2-9行为请求头,第10行为请求空行,第11行为请求体。

响应消息的数据格式

HTTP/1.1 200 OK
Connection:...
Date:...
Server:...
Last-Modified:...
Content-Length:...
Content-Type:...

(data data data data data ...)

响应报文有三个部分:初始状态行,响应头,响应空行以及响应体。状态行有3个字段:协议/版本,状态码和相应的状态信息。响应头对应的,Connection:表示发送报文后将怎么处理TCP连接,Date:表示响应头指示服务器产生并发送该响应报文的日期和时间,Server:指示该报文是由一台什么服务器产生的,Last-Modified:响应行指示了对象创建或者最后修改的日期和时间,Content-Length:指示了被发送对象中的字节数,Content-Type:指示了响应体中的对象是什么。响应体则是响应报文的主要部分,即它包含了所请求的对象本身。

常见的状态码即相关的短语:

  • 200 OK:请求成功
  • 301 Moved Permanent:请求的对象已经被永久转移,新的URL定义在响应报文的Location:在响应头中
  • 400 Bad Request:一个通用差错代码,指示该请求不能被服务器理解
  • 404 Not Found:被请求的文档不在服务器上
  • 505 HTTP Version Not Supported:服务器不支持请求报文所使用的HTTP协议版本

Cookie技术

HTTP服务器为无状态的,即不保留用户的状态信息,但是一个Web站点通常希望能识别用户,就得用到cookie技术,cookie技术有4个组件:

  1. 在HTTP响应报文中的一个cookie首部行
  2. 在HTTP请求报文中的一个cookie首部行
  3. 在用户端系统中保留有一个cookie文件,由用户的浏览器管理
  4. 位于Web站点的数据库

所以cookie可以跟踪用户状态,浏览器就会根据用户来给用户推荐...但是使用cookie是对用户隐私的一种侵害,可能很多站点收集你的信息,然后再将这些信息卖给第三方。

在IDEA上实现Cookie

使用步骤:

  • 创建Cookie对象,绑定数据
    new Cookie(String name,String value)
  • 发送Cookie对象
    response.addCookie(Cookie cookie)
  • 获取Cookie,拿到数据
    Cookie[] request.getCookies()

实现原理:基于响应头set-cookie和请求头cookie实现
cookie的细节:

  • 一次可以发送多个Cookie对象,使用response调用多次addCookie方法发送cookie即可
  • cookie的生命周期,默认情况是浏览器关闭,Cookie数据被摧毁,如果想实现持久化存储,就要使用setMaxAge(int seconds)方法,这个seconds参数有3个不同的情况,正数,负数和零。正数表示将Cookie数据写到硬盘的文件中,存储seconds秒,负数为默认值,零表示删除cookie信息
  • cookie的共享:
    • 在同一个tomcat服务器之间部署多个web项目,如果这些项目之间要共享cookie必须设置cookie的获取范围, setPath(String path) ,默认情况下是不共享的,要共享可以设置path为"/"
    • 不同tomcat服务器共享:setDomain(Sting path):如果设置一级域名相同,那么多个服务器之间的cookie可以共享,以百度为例子,百度贴吧的域名为tieba.baidu.com,百度新闻的域名为news.baidu.com其中他们都有一级域名:.baidu.com ,所以他们之间的cookie可以共享

Session技术

与Cookie一样都是会话技术,只是Session是服务端会话技术,Cookie是客户端会话技术,能够在一次会话的多次请求间共享数据,将数据保存在服务器端的对象(HttpSession)中,session可以存储任意类型,任意大小的数据。
获取HttpSession对象:HttpSession session =request.getSession();
使用HttpSession对象:getAttribute(String name),setAttribute(String name,Object value),removeAttribute(String name)。
Session的原理:Session的实现是依赖于Cookie的,通过请求头与相应头来完成。
Session的细节:

  • 默认情况下客户端关闭后,服务器不关闭两次获取的Session不同
    如果想获取同一个,则设置一个存活时间setMaxAge(int seconds)
  • 客户端不关闭,服务器关闭之后,获取的Session也不是同一个,但是要确保数据不丢失,tomcat自动完成一下工作:
    • session的钝化:在服务器正常关闭之前,将session对象序列化到硬盘上
    • session的活化:在服务器启动之后,将session文件转化为内存中的session对象

Cookie与Session的区别

  1. session存储数据在服务器端,cookie在客户端

  2. session没有数据大小限制,cookie有数据大小限制

  3. session数据安全,cookie相对不安全

猜你喜欢

转载自www.cnblogs.com/cubeblog/p/12558567.html