什么是会话
HTTP协议是无状态协议,也就是说对于服务器来说,每一次HTTP请求都是独立的,服务器不会知道你上一次请求做了什么。
因此当使用HTTP请求时你必须面对下面的场景:
这看起来真的很蠢,但是HTTP协议就是这么设计的,为了让服务器在一段请求与响应的过程中能够顺利的记住一些东西,这就是会话技术。
TIPS
在HTTP请求头中常常可以看到这个样一个请求头:connection:keep-alive。你可能会困惑,KTTP协议不是无状态的吗,那保持连接又是什么意思呢?
其实这个头是让服务器在一次TCP连接中返回多个响应,以便于减少TCP连接次数消耗资源,这和会话技术没有任何关系。
Cookie
为了能够让服务器能够记得一些请求中的重要信息,会话技术采用一种巧妙的方法—Cookie。
Cookie说白了就是一段由服务器发送给浏览器,并让浏览器保存在客户端的数据。
当浏览器下一次请求时,会把Cookie一并捎上发送过去,服务器通过Cookie就可以得道一些重要信息,比如你的身份等等。
使用Cookie
假设现在有一个页面,可以让用户输入名字,我们使用cookie来让服务器可以记住用户的名字。
login.jsp
%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>login</title>
</head>
<body>
<form action="<c:url value="/login"></c:url>">
name:<input type="text" name="name"><br>
<input type="submit" value="tijiao">
</form>
</body>
</html>
CookieServlet
@WebServlet(name = "CookieServlet",urlPatterns = "/login")
public class CookieServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取用户名
String name = request.getParameter("name");
//创建一个cookie
Cookie nameCookie = new Cookie("name", name);
//将这个cookie发送给浏览器
response.addCookie(nameCookie);
}
}
当在表单中输入liubei,点击提交时查看一下响应头:
可以发现,cookie实在响应头中被发送给浏览器的。
现在加如服务器上还有一个页面welcom.jsp,可以通过cookie让welcom.jsp认识下一次请求吗?
welcome.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>welcome</title>
</head>
<body>
<h1>${cookie.name.value}</h1>
</body>
</html>
在浏览器地址栏中输入welcome.jsp的url后就可以看到页面上打印除了名字:liubei。
查看一下请求头:
浏览器在发送请求的过程中会把该服务器交给浏览器保管的cookie通过请求头Cookie发送给服务器。
Cookie保存时间
默认情况下,Cookie的保存时间是会话,也就是说cookie只保存在浏览器的内存中,当浏览器关闭cookie便消失。再一次打开浏览器请求时,服务器便得不到cookie了。
如果想让浏览器保存一会cookie可以这样设置
//设置cookie的保存时间为一小时
nameCookie.setMaxAge(60*60);
删除cookie
删除cookie,只要创建一个同名cookie,将它得道生存时间设置为0即可:
@WebServlet(name = "LogoutServlet",urlPatterns = "/logout")
public class LogoutServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie nameCookie = new Cookie("name", "");
nameCookie.setMaxAge(0);
response.addCookie(nameCookie);
request.getRequestDispatcher("/web/welcom.jsp");
}
}
Cookie的domain和path
浏览器会访问各种不同的网站,可能每个网站都会让浏览器保存cookie,那么当浏览器发送请求时难道是将保存在本地的所有cookie都设置为请求头发送到服务器吗?
当然不是,浏览器会根据cookie的domain决定访问时发送哪些cookie,但是这样不够,因为一个服务器上可能有多个应用,所以还需要一个path。
浏览器根据domain和path决定发送哪些cookie的。