> 文档中心 > JavaWeb中的会话跟踪技术Cookie和Seesion区别介绍详解

JavaWeb中的会话跟踪技术Cookie和Seesion区别介绍详解

目录

  • 一、会话跟踪技术
    • 1、会话跟踪技术介绍
    • 2、为什么需要会话跟踪技术?
  • 二、 Cookie和Seesion详解
    • 1、Cookie
      • (1)Cookie是什么 ?
      • (2)为什么要使用Cookie?解决了什么问题 ?
      • (3)Cookie什么时候产生 ?
      • (4)Cookie的工作原理
      • (5)Cookie的基本使用
        • ⭐代码演示
      • (6)Cookie 存活时间
        • ⭐代码演示
      • (7)Cookie 存储中文
        • ⭐转码解码代码演示
        • ⭐未转码代码演示
      • (8)Cookie的缺点
      • (9)Cookie的使用场景
    • 2、Seesion
      • (1)Session是什么 ?
      • (2)Session的基本使用
        • ⭐代码演示
      • (3)Session的工作原理
      • (4)Session 的钝化、活化
        • 步骤演示
      • (5)Seesion的销毁和存活
        • ⭐查看存活时间代码演示
        • ⭐设置存活时间代码演示
    • 3、Cookie和Session的区别(面试题)
  • 作者:KJ.JK

一、会话跟踪技术


1、会话跟踪技术介绍

 * 会话: 用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。    在一次会话中可以包含"多次请求和响应"   

2、为什么需要会话跟踪技术?

      *  因为HTTP协议是无状态的,每次浏览器向服务器请求时,服务器都会将该请求视为新的请求,     因此我们需要"会话跟踪技术来实现会话内数据共享"      *  实现方式:  "客户端会话跟踪技术": "Cookie" "服务端会话跟踪技术": "Session" 

二、 Cookie和Seesion详解


1、Cookie


(1)Cookie是什么 ?

    Cookie: "客户端会话技术",将数据保存到客户端,以后"每次请求都携带Cookie数据进行访问"

(2)为什么要使用Cookie?解决了什么问题 ?

      * "web程序是使用HTTP协议传输的",而HTTP协议是"无状态的协议""对于事务处理没有记忆能力" "缺少状态意味着如果后续处理需要前面的信息,则它必须重传",这样可能导致每次连接传送的数据量增大   另一方面,如果服务器不需要获取之前的信息的时候它的应答就较快      * "使用cookie可以解决这个问题,实现数据的共享"

(3)Cookie什么时候产生 ?

   * 客户端向服务器端发送一个请求时,服务端向客户端发送一个Cookie然后浏览器将Cookie保存      * Cookie有两种保存方式:     1.Cookie保存在内存中    2.保存在客户端的硬盘中, 之后每次HTTP请求浏览器都会将Cookie发送给服务器端

JavaWeb中的会话跟踪技术Cookie和Seesion区别介绍详解


(4)Cookie的工作原理

   1. 浏览器端第一次发送请求到服务器端      2. "服务器端创建Cookie",该Cookie中包含用户的信息,然后将该Cookie发送到浏览器端      3. 浏览器端"再次访问服务器端"时会"携带服务器端创建的Cookie"      4. 服务器端"通过Cookie中携带的数据区分不同的用户"

(5)Cookie的基本使用

      * 发送 Cookie   1. 创建Cookie对象,设置数据 Cookie cookie = new Cookie("key","value");   //键值     2. 发送Cookie到客户端:使用response对象     response.addCookie(cookie);------------------------------------------------------------------------------------------------------------      * 获取 Cookie     3. 获取客户端携带的所有Cookie,使用request对象Cookie[] cookies = request.getCookies();     4. 遍历数组,获取每一个Cookie对象: for  5. 使用Cookie对象方法获取数据cookie.getName();     //获取键    cookie.getValue();    //获取值     

⭐代码演示

// 创建Cookie保存到浏览器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;import java.net.URLEncoder;@WebServlet("/a")public class AServlet extends HttpServlet {    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response);    }    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1.使用构造器创建Cookie对象 Cookie cookie = new Cookie("username", "zhangsan"); // 2.将Cookie写到浏览器端 response.addCookie(cookie);    }}------------------------------------------------------------------------------------------------------------// 读取Cookie数据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;import java.net.URLDecoder;@WebServlet("/b")public class BServlet extends HttpServlet {    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response);    }    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {     // 1.调用request.getCookies()返回一个Cookie对象数组 Cookie[] cookies = request.getCookies(); // 2.如果不为空,则遍历每个Cookie对象 if(cookies !=null){     for (Cookie cookie : cookies) {  String name = cookie.getName();  String value = cookie.getValue();  System.out.println(name+":"+value);     } }else {     // 3.如果数组为null,打印没有读取到Cookie     System.out.println("浏览器没有cookie"); }    }}

JavaWeb中的会话跟踪技术Cookie和Seesion区别介绍详解


(6)Cookie 存活时间

   * 默认情况下,Cookie 存储在浏览器内存中,当浏览器关闭,内存释放,则Cookie被销毁     * setMaxAge(int seconds): 设置Cookie存活时间, 秒为单位     正数:Cookie写入浏览器所在电脑的硬盘,"持久化存储" , 到时间自动删除     负数:  "默认值" , Cookie在当前浏览器内存中,当"浏览器关闭,则 Cookie被销毁":   立马删除对应 Cookie

⭐代码演示

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;import java.net.URLEncoder;// 创建Cookie保存到浏览器@WebServlet("/a")public class AServlet extends HttpServlet {    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response);    }    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1.使用构造器创建Cookie对象 Cookie cookie = new Cookie("username", "zhangsan"); // 3.设置Cookie的过期时间,单位是秒 cookie.setMaxAge(60*60*24*3);     //当前时间的3天后 // 2.将Cookie写到浏览器端 response.addCookie(cookie);    }}

JavaWeb中的会话跟踪技术Cookie和Seesion区别介绍详解


(7)Cookie 存储中文

      * Tomcat7 Cookie 不能直接存储中文  * Tomcat8 Cookie 可以存储中文但不能存储空格     * 如需要存储,则需要进行转码: URL编码      * " 转码: URLEncoder.encode("需要转码的内容" , "编码格式")* " 解码: URLDecoder.decode("解码的内容" , "用什么码来解")

⭐转码解码代码演示

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;import java.net.URLEncoder;// 创建Cookie保存到浏览器@WebServlet("/a")public class AServlet extends HttpServlet {    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response);    }    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //使用构造器创建Cookie对象 Tomcat 8Cookie 可以存储中文但不能存储空格 //URL编码    //第一个为内容   第二个为编码 String username = URLEncoder.encode(" 张 三", "utf-8");  Cookie cookie = new Cookie("username", username); cookie.setMaxAge(60*60); response.addCookie(cookie);    }}------------------------------------------------------------------------------------------------------------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;import java.net.URLDecoder;// 读取Cookie数据@WebServlet("/b")public class BServlet extends HttpServlet {    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response);    }    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1.调用request.getCookies()返回一个Cookie对象数组 Cookie[] cookies = request.getCookies(); // 2.如果不为空,则遍历每个Cookie对象 if(cookies !=null){     for (Cookie cookie : cookies) {  String name = cookie.getName();  String value = cookie.getValue();  if(name.equals("username")){      //URL解码  第一个参数为解码的内容, 第二个参数为用什么码来解      value=URLDecoder.decode(value,"utf-8");  }  System.out.println(name+","+value);     } }else {      // 3.如果数组为null,打印没有读取到Cookie     System.out.println("浏览器没有cookie"); }    }}

JavaWeb中的会话跟踪技术Cookie和Seesion区别介绍详解


JavaWeb中的会话跟踪技术Cookie和Seesion区别介绍详解


⭐未转码代码演示

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;import java.net.URLEncoder;// 创建Cookie保存到浏览器@WebServlet("/a")public class AServlet extends HttpServlet {    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response);    }    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Cookie cookie = new Cookie("username", "张 三"); cookie.setMaxAge(60*60); response.addCookie(cookie);    }}

JavaWeb中的会话跟踪技术Cookie和Seesion区别介绍详解


(8)Cookie的缺点

     * "数量受到限制":单个cookie保存的数据<=4KB,一个站点一般保存20~50Cookie  (不同浏览器不一样,SarafiChrome对每个域的Cookie数目没有严格限制)* "是不安全的":cookie对客户端是可见的,别有用心的人可以分析存放在本地的cookie并进行cookie欺骗,所以它是不安全的 * "浏览器可以禁用Cookie",禁用Cookie后,也就无法享有Cookie带来的方便

(9)Cookie的使用场景

  1.对安全性要求不高    2.不需要大量数据

2、Seesion


(1)Session是什么 ?

   * Session: "服务端会话跟踪技术,将数据保存到服务端"   JavaEE 提供 "HttpSession接口", 来实现"一次会话的多次请求间数据共享功能"

JavaWeb中的会话跟踪技术Cookie和Seesion区别介绍详解


(2)Session的基本使用

 * request.getSession();    //获取Session对象* Session对象功能      * void setAttribute(String name, Object o): "存储数据到 session 域中"      * Object getAttribute(String name) : 根据 key,"获取值"      * void removeAttribute(String name): 根据 key,"删除该键值对"

⭐代码演示

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;// 获取Session对象存储数据@WebServlet("/demo01")public class SessionDemo01 extends HttpServlet {    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response);    }    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1.获取Session对象 HttpSession session = request.getSession(); // 2.存储数据 session.setAttribute("username","zhangsan"); session.setAttribute("money",1000);    }}------------------------------------------------------------------------------------------------------------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;// 获取Session对象获取数据@WebServlet("/demo02")public class SessionDemo02 extends HttpServlet {    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response);    }    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1.获取Session对象 HttpSession session = request.getSession(); // 2.获取数据并转为对应的类型 String username = (String) session.getAttribute("username"); Integer money = (Integer) session.getAttribute("money"); System.out.println("username = " + username); System.out.println("money = " + money);    }}

JavaWeb中的会话跟踪技术Cookie和Seesion区别介绍详解


(3)Session的工作原理

    1. 浏览器端第一次发送请求到服务器端,服务器端创建一个Session同时会创建一个特殊的Cookie(name为JSESSIONID的固定值,value为session对象的ID)然后将该Cookie发送至浏览器端    2.浏览器端发送第N次请求到服务器端,浏览器端访问服务器端时就会携带该name为JSESSIONID的Cookie对象 3.服务器端根据name为JSESSIONID的Cookievalue(sessionId),去查询Session对象,从而区分不同用户

JavaWeb中的会话跟踪技术Cookie和Seesion区别介绍详解


(4)Session 的钝化、活化

 * 服务器重启后,Session中的数据是否还在?     * 钝化:"服务器正常关闭后" , "Tomcat自动将 Session数据写入硬盘的文件中"  * 活化: "再次启动服务器后","文件中加载数据到Session中"

步骤演示

JavaWeb中的会话跟踪技术Cookie和Seesion区别介绍详解


JavaWeb中的会话跟踪技术Cookie和Seesion区别介绍详解


JavaWeb中的会话跟踪技术Cookie和Seesion区别介绍详解


(5)Seesion的销毁和存活

     * "默认情况下" , 无操作 ,  "30分钟自动销毁"     * 怎么可以立即销毁 ?  * invalidate();     //立即销毁后,后面的Seesion操作都无效了     * 怎么查看Seesion的存活时间?    * getMaxInactiveInterval();     * 怎么设置Seesion的存活时间?   * 在WEB-INF中的web.xml中设置     <session-config>    <session-timeout>30</session-timeout> //这里的单位是分钟     </session-config>

⭐查看存活时间代码演示

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;// 获取Session对象获取数据@WebServlet("/demo02")public class SessionDemo02 extends HttpServlet {    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response);    }    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {     // 1.获取Session对象 HttpSession session = request.getSession(); // 3.获取Session过期时间: 默认1800秒 = 30分钟 int max = session.getMaxInactiveInterval();      //获取Session自动销毁的时间 System.out.println(max); // 2.获取数据并转为对应的类型 String username = (String) session.getAttribute("username"); Integer money = (Integer) session.getAttribute("money"); System.out.println("username = " + username); System.out.println("money = " + money);   //立即销毁 session.invalidate();     }}

JavaWeb中的会话跟踪技术Cookie和Seesion区别介绍详解


⭐设置存活时间代码演示

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"  version="4.0">    <session-config> <session-timeout>30</session-timeout>    </session-config></web-app>

JavaWeb中的会话跟踪技术Cookie和Seesion区别介绍详解


3、Cookie和Session的区别(面试题)

   1.存储位置不同 * "Cookie"的数据信息存放在"客户端浏览器"* "Session"的数据信息存放在"服务器"2.存储容量不同   * "单个Cookie保存的数据<=4KB,一个站点一般保存20~50个Cookie"(不同浏览器不一样,SarafiChrome对每个域的Cookie数目没有严格限制)   * 对于Session来说并"没有上限",但出于对服务器端的性能考虑,     Session内不要存放过多的东西,并且设置Session删除机制 (或者采用缓存技术代替session)   3.存储方式不同   * Cookie"只能保管ASCII字符串",并需要通过编码方式存储为Unicode字符或者二进制数据     * Session中能够"存储任何类型的数据" ,包括且不限于string,integer,list,map等   4.安全性不同   * "Cookie对客户端是可见的",别有用心的人可以分析存放在本地的cookie并进行cookie欺骗,     所以它是"不安全"* "Session存储在服务器上,不存在敏感信息泄漏的风险"   5.存储时间不同    *  Cookie默认浏览器关闭   *  Session 默认30分钟   * 开发可以通过设置cookie的属性,达到使cookie长期有效的效果   * session依赖于名为JSESSIONID的cookie,而cookie JSESSIONID的过期时间默认为-1,     只需关闭窗口该session就会失效,因而session不能达到长期有效的效果     6.服务器压力不同  * Cookie保管在客户端,"不占用服务器资源", "对于并发用户十分多的网站,cookie是很好的选择"    (Cookie不占用服务器资源)  * session是保管在服务器端的,每个用户都会产生一个session, 假如并发访问的用户十分多,会产生十分    多的session,耗费大量的内存    (Session 占用服务器资源)     7.键值对数量不同  * Cookie 存一个键和一个值  * Session 存n个键和值/*Cookie 和 Session 都是来完成一次会话内多次请求间数据共享的*/

作者:KJ.JK

文章对你有所帮助的话,欢迎给个赞或者 star,你的支持是对作者最大的鼓励,不足之处可以在评论区多多指正,交流学习