两种会话技术Cookie和Session总结

Cookie和Session

1. 会话概述

会话概念:

当用户在浏览器中输入服务器地址,第一次访问服务器,会话就开始。用户多次发送请求给服务器,服务器做响应,这就是会话过程。当用户关闭浏览器,会话就结束。

两种会话技术:

Cookie:浏览器端会话技术,数据保存在浏览器内存或者文件中

Session:服务器端会话技术,数据保存在服务端。

2. Cookie

2.1 Cookie介绍

cookie是由服务器发送给浏览器一个或多个键值对,键和值都是String类型,可以设置过期时间,如果不设置过期时间,浏览器关闭后就失效。

  • 在Chrome浏览器中查看Cookie

两种会话技术Cookie和Session总结

2.2 运行原理

两种会话技术Cookie和Session总结

2.3 Cookie类

Cookie类的方法 作用
Cookie(String name, String value) 通过构造方法创建一个Cookie
参数:键和值
String getName() 得到Cookie的键
String getValue() 得到Cookie的值
void setMaxAge(int explry) 设置会话过期的时间,单位是秒
setPath(“路径”) 设置Cookie访问的路径。
路径及其子路径都可以访问Cookie.其他路径不可访问。
  • 写入Cookie(HttpServletResponse对象的方法)

addCookie(Cookie cookie):将服务器创建好的Cookie通过响应发送给浏览器。

  • 读取Cookie(HttpServletRequest对象的方法)

Cookie[] getCookies(): 服务器得到所有浏览器端发送过来的所有Cookie信息。

  • 删除Cookie(Cookie类中的方法)

setMaxAge(0):设置生命周期为0,表示删除Cookie中的信息。

案例:

删除Cookie。(假设"visited"键值对已经创建。)

package com.zmysna.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.io.PrintWriter;

/**
 * 删除 Cookie
 */
@WebServlet(urlPatterns = "/demo1")
public class Demo01Practice extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws
            ServletException, IOException {
        //创建 Cookie 对象,与要删除的键同名
        Cookie cookie = new Cookie("visited", "");
        //设置路径
        cookie.setPath(request.getContextPath());
        //设置过期时间
        cookie.setMaxAge(0);
        //写入浏览器
        response.addCookie(cookie);
        //输出
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        out.print("删除 Cookie 成功");
    }
}

3. HttpSession

3.1 Session技术介绍

​ session是服务器端的会话技术,数据保存在服务器的内存中,每个会话由一个自己的会话ID,保存自己的数据,其他会话不能访问,每个浏览器或每个用户代表一个不同的会话对象。

3.2 Session和Cookie的区别

  • 存放位置:Session存放在服务器端,Cookie存放在客户端。
  • 存储类型:Session键是String类型,值可以是Object类型。Cookie键和值都是String类型。

3.3 HttpSession接口的使用

  • 通过请求对象获得Session对象

HttpSession request.getSession();

  • HttpSession接口的方法
HttpSession接口方法 作用
String getId() 得到会话的ID,是一个唯一的32位16进制数字
long getCreatonTime() 会话创建的时间。返回long类型。
long getLastAccessedTime() 会话上次访问的时间
boolean isNew() 判断是否是一个新的会话
ServletContext getServletContext() 通过会话得到上下文对象

代码演示

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;
import java.io.PrintWriter;
import java.sql.Timestamp;

@WebServlet(name = "Demo2SessionServlet", urlPatterns = "/demo2")
public class Demo2SessionServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws
            ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        //得到会话对象
        HttpSession session = request.getSession();
        //得到会话的 ID,在服务器上唯一的 32 位的十六进制数
        out.print("会话 ID:" + session.getId() + "<hr>");
        //表示会话创建的时间,返回 long 类型。表示 1970-1-1 到这个时间之间相差的毫秒数
        out.print("会话创建时间:" + new Timestamp(session.getCreationTime()) + "<hr>");
        //表示会话上次访问的时间
        out.print("上次访问的时间:" + new Timestamp(session.getLastAccessedTime()) + "<hr>");
        //判断当前是否是一个新的会话,是的返回 true
        out.print("是否新的会话:" + session.isNew() + "<hr>");
        //通过会话得到上下文对象
        out.print("上下文对象:" + session.getServletContext() + "<hr>");
    }
}

结果

两种会话技术Cookie和Session总结

  • 会话域的方法
HttpSession 的方法 作用
Object getAttribute(" 名字") 从会话域中得到一个值
void setAttribute(" 名字",Object 数据) 向会话域中添加一对键和值
void removeAttribute(" 名字") 从会话域中删除键和值

3.4 Session原理分析

两种会话技术Cookie和Session总结

  1. 第1次访问用户没有会话,调用getSession方法,服务器创建一个会话对象

  2. 每个会话都有一个唯一的ID,通过Cookie发送给浏览器。

  3. 浏览器得到会话ID,下次访问再通过Cookie发送给服务器,相当于带了密码条给服务器。

  4. 服务器通过Cookie中的ID,与服务器中会话ID进行比较,访问同一个会话域中数据

3.5 Session的过期时间

  • 查看过期时间

int getMaxInactiveInterval():查看会话存活时间,默认是30分钟

  • 设置过期时间
  1. 通过方法来设置

void setMaxInactiveInterval(int M): 设置过期时间,单位是秒。

  1. 通过web.xml设置
<?xml version="1.0" encoding="UTF-8"?>
<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_3_1.xsd"
version="3.1">
	<!--配置会话过期的时间-->
	<!--单位是分钟-->
	<session-config>
		<session-timeout>5</session-timeout>
	</session-config>
</web-app>
  • 使会话立即失效

invalidate(): 会话立刻失效,可以用于用户退出和注销。