HTTP协议与Session会话以及cookies

介绍

HTTP,超文本传输协议。最大的作用就是确定了请求和响应数据的格式,浏览器发送给服务器数据:请求报文;服务i去返回给浏览器数据 :响应报文。

请求

请求包含三个部分:

  • 请求行:请求的方式,请求的URL,请求的协议(一般都是HTTP1.1)

image-20220407131452781

  • 请求消息头:通过具体的参数对本次请求进行详细说明,以键值对的方式进行展现。

    Accept代表可以接受的文件类型,其他表示编码格式,接受的用语言等等

    image-20220402143706322

    比较重要的消息头:

    名称 功能
    Host 服务器的主机地址
    Accept 声明当前能够接受的媒体类型
    Referer 当前请求来源页面的地址
    Content-Length 请求内容的长度
    Content-Type 请求体的内容类型
    Cookie 浏览器访问服务器时携带的Cookie数据
    • 请求体

    它将一个页面表单中的组件值通过param1=value1&param2=value2的键值对形式编码成一个格式化串,它承载多个请求参数的数据。不但报文体可以传递请求参数,请求URL也可以通过类似于“/chapter15/user.html? param1=value1&param2=value2”的方式传递请求参数。

    get方式,没有请求体,但是有一个queryString,在URL之后

    image-20220407132139686

    post方式,有请求体,from data

    image-20220407132212295

    json格式,有请求体,request payload

    响应

    • 响应行:协议+响应状态码+响应状态

      image-20220407132537095

    • 响应头

    image-20220407132607612

    • 响应体

    响应的实际内容,响应的使响应的标签等

Http是无状态的

当我们传输两次请求时,服务器无法区分是否是同一个客户端发送过来的,比如第一次请求是添加购物车,第二次是请求结账,但是服务器无法判断两次请求的主题是否为同一人。

Session会话

Session会话是浏览器通过给不同的请求分配id,标记同一个主体所发送的请求事务,达到跟踪的效果

在控制台获得打印session的消息

1
2
3
4
5
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession httpSession= req.getSession();
System.out.println(httpSession.getId());
System.out.println(httpSession.isNew());
}

可以发现两次的请求的session都是相同的,但是第一次请求会创建一个,但是第二次不会去新创建一个session

image-20220402151448524

常用的API,注意session的有效会话为半个小时

1
2
3
4
5
6
7
8
9
10
11
//获取当前会话
HttpSession httpSession= req.getSession();
//获取sessionid
System.out.println(httpSession.getId());
//判断是否为新的
System.out.println(httpSession.isNew());
//获取最大会话时间
System.out.println(httpSession.getMaxInactiveInterval());
//强制会话失效
httpSession.invalidate();
//获取会话的时间等

Session保存作用域

1
2
//向当前的session保存作用域保存一个数据,可以通过另外一个组件获得响应的值,但是与对应的sessionid相对应
httpSession.setAttribute("name","java");
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package com.zss.servlets;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
* @author zss
*/
public class GetServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Object nameObj=req.getSession().getAttribute("name");
System.out.println(nameObj);
}
}

image-20220402153847848

但是 注意,当我们使用两种不同的浏览器获取数据时,其对应的主体对象不同,其session也会不同,所以我们无法通过再次访问另外一个页面再次对其进行访问

image-20220402154450198

cookies

image-20220415211406461

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@WebServlet(urlPatterns = {"/Demo01"})
public class Demo01Servlet extends HttpServlet {

@Override
public void init(){

}

@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//创建一个cookie对象
Cookie cookie=new Cookie("name","value");
//将cookie对象保存到浏览器
resp.addCookie(cookie);


req.getRequestDispatcher("hello.html").forward(req,resp);

}
}

运行以上代码之后,可以在这里找到cookies保存的地址

image-20220415212718679

image-20220415212935029

我们也可以对其进行设置时常,保证cookie保存的时间,时间过去,浏览器会进行删除,cookie可以帮助我们记住用户名和密码,并且设置时间,并且设置几天免登录等等操作。