一、HTTP协议
请求
1请求行
2、请求消息头
3、请求主体
响应
1、响应行
2、响应头
3、响应体
二、会话
HTTP无状态:服务器无法判断两次请求是否为同一个客户端发过来的。
因此通过会话跟踪来解决这个问题
@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获取session,如果是客户端第一次向服务器端发送请求,则会创建一个新的sessionHttpSession session = req.getSession();System.out.println("session ID:"+session.getId());}
第一次发送请求时候,会分配给客户端一个Session,其id为:
当从浏览器刷新一次(在发送一次请求),session id的值没变,同时在发送请求时会带上最初分配的session,让服务器知道自己的SessionID
常用的一些API:
2、Session的保存作用域
sesssion保存作用域是和具体的一个session对应的
public class Demo04Servlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {HttpSession session = req.getSession();session.setAttribute("uname","linda");}
}public class Demo05Servlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {HttpSession session = req.getSession();Object uname = session.getAttribute("uname");System.out.println(uname);}
}
先用google浏览器访问demo04,会给分配一个sessionID并且把uname赋值为linda给这个客户端,之后只要使用Google访问demo5来获取uname的值,都是以此sessionID 来发送请求等操作(不断开连接),获取的都是linda
null的值为使用其他浏览器的时候,直接去访问demo05的时候输出的值,因为给这个客户端没有分配Session,并且也没有初始化uname的值,所以返回的是null
一个session的作用域在一个客户端内。