HTTP
HTTP: Hyper Text Transfer Protocol 即超文本传输协议,定义了客户端与服务器端通信时,发送数据的格式。
特点:
- 基于TCP/IP的高级协议
- 默认端口号为80
- 基于请求/响应模型的:一次请求对应一次响应
- 无状态的:每次请求之间相互独立,不能交互数据,不保存关于客户的任何信息
http1.0是每次请求都会建立新的连接,现在使用的是http1.0版本,它会复用连接,即客户端向服务器发送请求,连接通道会一直打开。也就是非持续连接与持续连接
请求消息的数据格式
-
请求行:由请求方式,请求url,请求协议/版本组成
请求方式:HTTP协议有7种请求方式,常见的有2种,一个是GET一个是POST。GET和POST的区别:GET:
- 请求参数在请求行中,在url的后面
- 请求的url长度有限制
- 不安全
POST:
- 请求参数在请求体种
- 请求的url长度无限制
- 相对安全
-
请求头:客户端的浏览器告诉服务器一些信息,格式为请求头名称:请求头值。常见的请求头有两种
- User-Agent:告诉服务器客户端使用浏览器的版本信息
- Referer:url,告诉浏览器当前请求从哪来
-
请求空行:就是一个空行,用于分割POST请求的请求头和请求体。
-
请求体(正文):封装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个组件:
- 在HTTP响应报文中的一个cookie首部行
- 在HTTP请求报文中的一个cookie首部行
- 在用户端系统中保留有一个cookie文件,由用户的浏览器管理
- 位于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可以共享
- 在同一个tomcat服务器之间部署多个web项目,如果这些项目之间要共享cookie必须设置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的区别
-
session存储数据在服务器端,cookie在客户端
-
session没有数据大小限制,cookie有数据大小限制
-
session数据安全,cookie相对不安全