Cookie和Session

Cookie简介

Cookie是1993年由网景公司(Netscape)前雇员发明的一种进行网络会话状态跟踪的技术。

会话是由一组请求与响应组成,是围绕着一件相关事情所进行的请求与响应。所以这些请求与响应之间一定是需要有数据传递的,即是需要进行会话状态跟踪的。然而HTTP协议是一种无状态协议,在不同的请求间是无法进行数据传递的。此时就需要一种可以进行请求间数据传递的会话跟踪技术,而Cookie就是一种这样的技术。

cookie是由服务器生成,保存在客户端的一种信息载体。这个载体中存放着用户访问该站点的会话状态信息。只要Cookie没有被清空,或者 Cookie没有失效,那么,保存在其中的会话状态就有效。

用户在提交第一次请求后,由服务器生成Cookie,并将其封装到响应头中,以响应的形式发送给客户端。客户端接收到这个响应后,将cookie 保存到客户端。当客户端再次发送同类请求后,在请求中会携带保存在客户端的Cookie 数据,发送到服务端,由服务器对会话进行跟踪。

Cookie技术并不是JavaWeb开发专属技术,而是属于web开发的技术,是所有web开发语言均支持的技术。Cookie是由若干键值对构成,这里的键一般称为name,值称为value。Cookie 中的键值对均为字符串。

@WebServlet(name = "Servlet1", value = "/Servlet1")
public class Servlet1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	// 生成Cookie
        Cookie cookie1 = new Cookie("username", "pangjian");
        Cookie cookie2 = new Cookie("password", "123");
		// 添加到响应体
        response.addCookie(cookie1);
        response.addCookie(cookie2);

        response.sendRedirect("/studentweb/Servlet2");

    }

}
@WebServlet(name = "Servlet2", value = "/Servlet2")
public class Servlet2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	// 获取,服务端是不用存储Cookie的
        Cookie[] cookies = request.getCookies();
        for (Cookie c : cookies) {
            System.out.println(c.getName() + c.getValue());
        }
        response.getWriter().print("获取cookie");
    }

}

Session简介

Session,即会话,是 web开发中的一种会话状态跟踪技术。前面的Cookie也是一种会话跟踪技术。不同的是cookie是将会话状态保存在了客户端,而Session则是将会话状态保存在了服务器端

“会话”是当用户打开浏览器,从发出第一次请求开始,一直到最终关闭浏览器,就表示一次会话的完成。

Session并不是Javaweb开发所特有的,而是整个web开发中所使用的技术。在JavaWeb开发中,Session是以javax.servlet.http.HttpSession的接口对象的形式出现的。

@WebServlet(name = "Servlet1", value = "/Servlet1")
public class Servlet1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	// Session创建
        HttpSession httpSession = request.getSession(true);
        httpSession.setAttribute("username", "pangjian");

        response.sendRedirect("/studentweb/Servlet2");

    }

}
@WebServlet(name = "Servlet2", value = "/Servlet2")
public class Servlet2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	// Session获取
        // 获取时候设置为false,当获取不到Session时不新建一个Session
        HttpSession httpSession = request.getSession(false);
        String username = null;
        if (httpSession != null) {
            username = (String) httpSession.getAttribute("username");
        }
        response.getWriter().print(username);
    }

}

原理

在服务器中系统会为每个会话维护一个 Session。不同的会话,对应不同的session。

写入Session列表

服务器对当前应用中的Session是以Map 的形式进行管理的,这个Map称为 session列表。该Map的 key为一个32位长度的随机串,这个随机串称为JSSESSIONID , value则为 session对象的引用。当用户第一次提交请求时,服务端servlet中执行到request.getsession()方法后,会自动生成一个 Map.Entry对象,key为一个根据某种算法新生成的JSessionID,value则为新创建的HttpSession对象。

服务器生成并发送Cookie

在将session信息写入Session列表后,系统还会自动将“JSSESSIONID”作为name,这个32位长度的随机串作为value,以cookie的形式存放到响应报头中,并随着响应,将该Cookie发送到客户端。

客户端接收并发送Cookie

客户端接收到这个Cookie 后会将其存放到浏览器的缓存中。即只要客户端浏览器不关闭,浏览器缓存中的Cookie就不会消失。当用户提交第二次请求时(为了保证第二次请求是该会话中,Cookie存了JSSESSIONID和资源路径),会将缓存中的这个Cookie,伴随着请求的头部信息,一块发送到服务端。

从Session列表中查找

服务端从请求中读取到客户端发送来的cookie,并根据cookie的JSSESSIONID的值,从Map中查找相应 key所对应的value,即session对象。然后,对该Session对象的域属性进行读写操作。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值