blog
原创

JavaWeb学习笔记——会话技术

@[TOC]

会话技术

会话:一次会话中包含多次请求和响应

浏览器第一次给服务器发送请求时,会话建立,直到有一方断开为止

功能

在一次会话的范围内的多次请求之间共享数据

客户端会话技术:Cookie

可将数据保存到客户端的会话技术

Cookie基本使用方式

创建Cookie对象

Cookie构造方法

Cookie(String name, String value)

Cookie cookie = new Cookie("msg","Cookie");
发送Cookie

response.addCookie(Cookie cookie)

response.addCookie(cookie);
获取Cookie

Cookie[] request.getCookies()

Cookie[] cookies = request.getCookies();
获取数据

String getName():获取Name

String getValue():获取Value

String name = cookie.getName();
String value = cookie.getValue();

示例

创建并发送 Demo1

public class CookieDemo1 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 创建Cookie
        Cookie cookie = new Cookie("msg","Cookie");
        // 发送Cookie
        response.addCookie(cookie);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

获取并输出 Demo2

public class CookieDemo2 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 获取Cookie
        Cookie[] cookies = request.getCookies();
        // 遍历Cookies
        if (cookies != null){
            for (Cookie cookie : cookies) {
                String name = cookie.getName();
                String value = cookie.getValue();
                System.out.println(name + ":" + value);
            }
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

Cookie实现原理

基于响应头set-cookie和请求头cookie实现

当客户端浏览器第一次发送请求给服务器,response会将cookie中内容键值对设置到响应头set-cookie中,当浏览器发现set-cookie响应头时,将set-cookie中携带的数据保存到浏览器

在这里插入图片描述

在客户端第二次请求服务器时,请求头中的cookie会将之前的内容发送给服务器

在这里插入图片描述

Cookie细节

一次发送多个Cookie

一次可以发送多个Cookie

// 创建Cookie
Cookie cookie1 = new Cookie("msg1","Cookie1");
Cookie cookie2 = new Cookie("msg2","Cookie2");
// 发送Cookie
response.addCookie(cookie1);
response.addCookie(cookie2);

在这里插入图片描述

Cookie的存活时间

○ 默认情况下,当浏览器关闭后Cookie数据会被销毁

○ 可通过setMaxAge(int sec)方法设置Cookie的存储时间

  • sec为正数:将Cookie数据写到硬盘文件中,数值为Cookie存储时间
  • sec为负数:默认值,当浏览器关闭时Cookie数据会被销毁
  • sec为0:删除Cookie信息
Cookie保存中文

在Tomcat 8之前,Cookie不可以直接存储中文数据,需要将中文数据转码

Tomcat 8之后可以存储中文数据

Cookie cookie2 = new Cookie("msg2","饼干");
response.addCookie(cookie2);

在这里插入图片描述

Cookie范围

若在一个Tomcat服务器中部署了多个web项目,默认情况下,cookie无法在这些web项目中共享

通过setPath(String path)方法可以设置Cookie的获取范围,没有调用该方法时,path会默认设置为当前的虚拟目录

若希望Cookie可以在当前服务器部署的多个项目中共享,可以将path设置为"/"

cookie.setPath("/");

若希望在多个服务器中共享Cookie,可以调用setDomain(String path)方法,如果设置一级域名相同,则cookie可以在多个服务器之间共享

Cookie的特点和作用

  1. Cookie将数据存在客户端浏览器
  2. 浏览器对于单个Cookie的大小、同一个域名下的Cookie数量有限制

Cookie可以存储少量的、不敏感的数据,并且可以在不登录的情况下完成服务器对客户端的身份识别

服务器端会话技术:Session

在一次会话的多次请求之间共享数据,将数据保存在服务器端的对象中

Session基本使用方式

创建HttpSession对象
HttpSession session = request.getSession();
设置Session内容

void setAttribute(String name, Object value)

session.setAttribute("key","value");
获取Session内容

Object getAttribute(String name)

Object value = session.getAttribute("key");
移除Session内容

void removeAttribute(String name)

session.removeAttribute("key");

示例

在Demo1中设置内容

@WebServlet("/SessionDemo1")
public class SessionDemo1 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession();
        session.setAttribute("key","value");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

在Demo2中获取内容

@WebServlet("/sessionDemo2")
public class sessionDemo2 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession();
        Object value = session.getAttribute("key");
        System.out.println(value);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

Session实现原理

Session的实现依赖于Cookie

当第一次获取Session时,会在内存中创建一个新的Session对象,并通过set-cookie响应头保存一个JSESSIONID

在这里插入图片描述

在第二次访问其他资源时,请求头中的cookie会携带该JSESSIONID,并通过这个id在内存中查找是否存在id值相同的Session对象

在这里插入图片描述

Session是通过依赖Cookie来保证一次会话内的多次请求响应获取的是同一个Session对象

Session细节

客户端关闭,服务器不关闭

默认情况下,客户端关闭后第二次获取的Session与第一次不同

在这里插入图片描述

若希望客户端关闭后还能获取到相同的Session,可以通过Cookie来保存JSESSIONID,并设置存活时间来持久化保存

在这里插入图片描述

HttpSession session = request.getSession();
Cookie cookie = new Cookie("JSESSIONID",session.getId());
cookie.setMaxAge(60 * 60);
response.addCookie(cookie);
System.out.println(session);
客户端不关闭,服务器关闭

服务器关闭重启后,前后两次的Session对象不是同一个

为了确保Session的数据不丢失,Tomcat会自动执行两个操作

  • Session的钝化:在服务器正常关闭之前,会将Session对象序列化到硬盘上
  • Session的活化:在服务器启动后,将Session文件转为内存中的Session对象
Session何时被销毁
  1. 服务器关闭时Session会被销毁

  2. Session对象调用invalidate()来销毁自己

  3. Session默认失效时间为30分钟,可以在web.xml中修改该时间

Session特点

  1. Session用于存储一次会话多次请求的数据,数据存储在服务器端
  2. Session可以存储任意类型、任意大小的数据
Session与Cookie的区别
  1. Session存储在服务器端,Cookie存储在客户端
  2. Session没有数据大小限制
  3. Session数据安全,Cookie相对不安全
Java Web
  • 作者:Melonico
  • 发表时间:2021-03-15 17:53
  • 更新时间:2021-03-15 17:53

评论

暂无评论,快来发表第一个评论吧!
留言
TOP