http协议
http协议:超文本连接协议
http协议有两个特性:
- 请求----响应式(服务器被动请求)。服务器只有在客户端发起请求时才与之建立链接
doGet(HttpServlertRequest, HttpServletResponse) - 无记忆性----短链接。服务器无法记住客户端是谁。
会话管理(Session)
为了解决http协议存在的问题,引入了会话管理
服务器能处理不同的request请求,对每个用户保持一个会话。每个会话是独立安全的。
- 保持记录
- 时效性:30min
- 会话隔离(会话之间相互独立,互不干扰)
会话管理的实现
客户端A和服务器的第一次交互:
- 客户端A发起请求到服务器,比如需要一张图片
- 服务器收到请求,产生一个HttpSession对象(有一个唯一的ID值)
- 服务器存储这个HttpSession对象,在服务器中分配一定的空间
- 服务器产生一个cookie对象,将JSESSIONID存入cookie,并发送给客户端(浏览器),存储在浏览器。
客户端A和服务器的第n次交互:
- 客户端A发起请求到服务器,携带cookie对象的JSESSIONID
- 服务器检查到客户端A的JSESSIONID,不产生HttpSession对象
- 从现有的HttpSession对象中查找此ID。如果ID存在,指定session操作。 如果ID不存在,可能产生一个新的session
例子
@WebServlet("/session.action")
public class SessionServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
HttpSession session = request.getSession();// 获取Session对象
// session.setMaxInactiveInterval(60);// 设置存活时间60s,如果不设置,默认为30min
session.setAttribute("key", "我是session的值");// 在Session对象里放入键值对
System.out.println(session.getId());
Cookie cookie = new Cookie("hello", "cookie");// 创建Cookie对象,并存入键值对
response.addCookie(cookie);// 往页面里写入cookie
response.sendRedirect("session.jsp");// 重定向
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>我的session:${sessionScope.key}</h1>
</body>
</html>
往页面上写入cookie,就会在浏览器把一些信息记录下来。比如上网点击一件衣服,会向后台传递一些信息,后台就会把这些信息存入cookie里面。在下次打开浏览器的时候可能就会推荐到这件衣服。一些杀毒软件,为了用户隐私有时会建议清除浏览器的cookie,
cookie:浏览器
-
存在于浏览器
-
存活时间: 浏览器关闭
-
存文本
-
数据量比较小
-
存JSessionID
-
不安全
HttpSession:服务器
-
存于服务器
-
存活时间: 30
-
存对象
-
数据量(不建议大数据)
-
产生SessionID
-
安全