Http协议的内容

  • 基于TCP协议,面向连接,安全
  • 一次请求一次响应
  • 每次请求都是独立的,多次请求不共享数据,但节约信道资源
  • Java中利用会话(cookie,session)来解决多次请求数据共享问题

请求数据格式

打开F12访问百度,点击网络可查看

  • Get没有请求体
  • 请求数据有三部分:请求行,请求头,请求体

响应数据格式

springboot查找cookie springboot set-cookie_http

常见响应状态码

状态码

英文描述

解释

200

OK

客户端请求成功,即处理成功,这是我们最想看到的状态码

302

Found

指示所请求的资源已移动到由Location响应头给定的 URL,浏览器会自动重新访问到这个页面

304

Not Modified

告诉客户端,你请求的资源至上次取得后,服务端并未更改,你直接用你本地缓存吧。隐式重定向

400

Bad Request

客户端请求有语法错误,不能被服务器所理解

403

Forbidden

服务器收到请求,但是拒绝提供服务,比如:没有权限访问相关资源

404

Not Found

请求资源不存在,一般是URL输入有误,或者网站资源被删除了

428

Precondition Required

服务器要求有条件的请求,告诉客户端要想访问该资源,必须携带特定的请求头

429

Too Many Requests

太多请求,可以限制客户端请求某个资源的数量,配合 Retry-After(多长时间后可以请求)响应头一起使用

431

Request Header Fields Too Large

请求头太大,服务器不愿意处理请求,因为它的头部字段太大。请求可以在减少请求头域的大小后重新提交。

405

Method Not Allowed

请求方式有误,比如应该用GET请求方式的资源,用了POST

500

Internal Server Error

服务器发生不可预期的错误。服务器出异常了,赶紧看日志去吧

503

Service Unavailable

服务器尚未准备好处理请求,服务器刚刚启动,还未初始化好

511

Network Authentication Required

客户端需要进行身份验证才能获得网络访问权限

Apache Tomcat

  • Tomcat是一个轻量级web服务器,封装了Http协议的很多代码
  • 支持Servlet/JSP,也称Web容器,也称Servlet容器
  • SpringBoot 本身支持有两类的 WEB 容器:默认的 Tomcat、Jetty

Servlet

  • Tomcat服务器内嵌Servlet
  • Servlet是处理请求的技术
  • 不同于静态资源html等,servlet是动态的

springboot查找cookie springboot set-cookie_java_02

url和uri

urn:统一资源名称(目前几乎没有使用urn,uri包括urn和url,目前的uri基本都是url)
uri:统一资源标识符,用于标识唯一的资源
url:统一资源定位符,用于找到资源的路径

Request请求

  • HttpServletRequest和HttpServletResponse直接放在方法的形参中就可以使用了,servlet会自动拦截请求中的请求行,请求头,请求体并将其封装在httpServletRequest对象中
  • 同样的,在服务器响应时,servlet会将httpServletResponse中设置的响应头等信息封装后发送给客户端

Request请求转发

  • 服务器内部的资源跳转方式
  • 用户不知道被转发了,浏览器路径不变
  • 转发需要使用setAttribute等方法共享数据

springboot查找cookie springboot set-cookie_java_03

Response响应

springboot查找cookie springboot set-cookie_java_04

springboot查找cookie springboot set-cookie_java_05

会话跟踪技术

  • 打开浏览器,访问一个网站:建立会话
  • 服务器or浏览器关闭:结束会话
  • 一次会话可以包含多次请求和响应
  • 会话跟踪:服务器需要识别多次请求是否来自同一个浏览器,以便在同一会话的多次请求中共享数据
  • Http是无状态的,所以需要会话跟踪实现会话内数据共享
  • 客户端会话跟踪技术:Cookie
  • 服务的会话跟踪技术:Session

Cookie

实际上就是一个保存在客户端某cookie文件中的键值对,客户端可以获取cookie,服务端可以设置cookie

cookie一般最大只有3kb,但可以存储特别多的键值对,cookie在前端每次发送请求时都会发送

后端发送cookie

一定要new一个Cookie对象

springboot查找cookie springboot set-cookie_http_06

后端接收cookie

getCookies()获取特定的cookie

springboot查找cookie springboot set-cookie_客户端_07

Cookie的原理

  • Cookie基于HTTP协议
  • 请求头:发送所有Cookie的数组;
    响应头:set-Cookie:键:值
  • 设置Cookie存活时间:先new一个Cookie对象,然后setMaxAge(),然后response.setCookie()

Cookie存储中文

  • 中文必须先编码,取时必须先解码
  • 由于Cookie是携带在URL中的,因此用URLEncoder类中的方法来进行编码解码

springboot查找cookie springboot set-cookie_springboot查找cookie_08


springboot查找cookie springboot set-cookie_springboot查找cookie_09

Session

  • 服务的会话跟踪技术,数据保存在服务的
  • Session相比Cookie更安全,但不能实现类似:客户端记住账号密码的功能
  • Session保存在后端的内存中

后端设置Session

会自动生成一个JSessionID=xxxxxxxxxx保存在Cookie中,因此保证了会话中Session的共享

springboot查找cookie springboot set-cookie_http_10

钝化、活化

springboot查找cookie springboot set-cookie_客户端_11

销毁

springboot查找cookie springboot set-cookie_java_12

Cookie和Session区别

springboot查找cookie springboot set-cookie_http_13

Filter拦截器

配置拦截资源路径

springboot查找cookie springboot set-cookie_服务器_14

过滤链

springboot查找cookie springboot set-cookie_springboot查找cookie_15