会话-Cookie

什么是会话

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的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值