javaweb之Cookie和session

一:Cookie介绍和使用

1.1 cookie介绍

HTTP协议作是无状态协议,无状态指每次request请求之前是相互独立的,当前请求并不会记录它的上一次请求信息。 存在这样的问题,既然无状态,完成一套完整的业务逻辑,需要发送多次请求,那么怎么标识这些请求都是同个浏览器操作呢?

1.2 解决方案

  • 浏览器发送request请求到服务器,服务器除了返回请求的response之外,还给请求分配一个唯一标识ID和response一并返回给浏览器
  • 服务器在本地创建一个map结构,专门以key-value存储这个ID标识和浏览器的关系
  • 当浏览器的第一次请求后已经分配一个ID,当第二次访问时会自动带上这个标识ID,服务会获取这个标识ID去map里面找上一次request的信息状态且做对应的更新操作 服务端生成这个全局的唯一标识,传递给客户端用于标记这次请求就是cookie; 服务器创建的那个map结构就是session。
  • cookies由服务端生成,用于标记客户端的唯一标识,在每次网络请求中,都会被传送。
  • session服务端自己维护的一个map数据结构,记录key-Object上下文内容状态
  • 核心:它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态。Cookie使基于无状态的HTTP协议记录稳定的状态信息成为了可能。 浏览器查看多个站点的cookie

1.3 Cookie的缺陷

  • cookie会被附加在每个HTTP请求中,增加了流量。
  • 在HTTP请求中的cookie是明文传递的,所以安全性成问题,除非用HTTPS
  • Cookie的大小有限制,对于复杂的存储需求来说不满足

1.4 cookie的属性

  • Name : 名称
  • Value : 值
  • Domain:表示当前cookie所属于哪个域或子域下面
  • Expires/Max-age:表示了cookie的有效期,是一个时间,过了这个时间,该cookie就失效了
  • Path:表示cookie的所属路径。
  • size: 大小,多数浏览器都是4000多个字节
  • http-only: 表示这个cookie不能被客户端使用js读取到,是不公开的cookie
    • (chrome调试器的console中输入document.cookie将得不到标记为HttpOnly的字段)
  • Secure: 标记为 Secure 的Cookie只应通过被HTTPS协议加密过的请求发送给服务端

1.5 获取cookie代码实践

1、获取cookie

package net.xdclass.net;

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

@WebServlet("/get_cookie_test")
public class GetCookieServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Cookie[] cookies = request.getCookies();
        for(Cookie cookie:cookies){
            // 获取cookie的value值
            System.out.println(cookie.getDomain());
            System.out.println(cookie.getName());
            System.out.println(cookie.getValue());
        }
    }

}

2、设置cookie

package net.xdclass.net;

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

@WebServlet("/gen_cookie_test")
public class GeneCookieServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Cookie cookie = new Cookie("token","asjdlfajsldjfalksdf");

        // 20秒过期时间,过期后不会自动携带过去
        cookie.setMaxAge(20);

        response.addCookie(cookie);
        request.getRequestDispatcher("/index.jsp").forward(request,response);

    }

}

二:Session的应用与介绍

2.1 session介绍

cookie和session都是为了弥补http协议的无状态特性,对server端来说无法知道两次http请求是否来自同一个用户,利用cookie和session就可以让server端知道多次http请求是否来自同一用户

2.2 生成和使用流程

  • 浏览器第一次发送request请求到服务器,服务器除了返回请求的response之外,还给请求分配一个唯一标识sessionId和response一并返回给浏览器
  • 服务器在本地创建一个map结构,专门以key-value存储这个sessionId和浏览器的关系
  • 当浏览器的第一次请求后已经分配一个sessionId,当第二次访问时会自动带上这个标识sessionId
  • 服务器通过查找这个sessionId就知道用户状态了,并更新sessionId的最后访问时间。
    注意: Session是有时限性的:比如如果30分钟内某个session都没有被更新,服务器就会删除这个它。

2.3 代码实践

package net.xdclass.net;

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

@WebServlet("/session_servlet")
public class SessionServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        // 获取sessionid,java里面叫jsessionid
        System.out.println("sessionid = " + session.getId());

        System.out.println("创建时间,时间戳:" + session.getCreationTime());
        // 是否是初次创建,记得清楚浏览器cookie,验证sessionid
        System.out.println("isNew = " +session.isNew());

        // 往session存储东西
        session.setAttribute("name","clskdieoskd");
    }
}

三:总结:

  • 服务端生成这个全局的唯一标识,传递给客户端用于标记这次请求就是cookie;
  • 服务器创建的那个map结构就是session。
  • cookies由服务端生成,用于标记客户端的唯一标识,在每次网络请求中,都会被传送。
  • session服务端自己维护的一个map数据结构,记录key-Object上下文内容状态
  • 总言之cookie是保存在客户端,session是存在服务器,session依赖于cookie
  • cookie里面存储的就是JSESSIONID
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

竹意雅韵(马)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值