javaEE-03-cookie与session

news2024/9/22 7:31:37

文章目录

  • Cookie
    • 创建Cookie
    • 获取Cookie
    • 更新Cookie
    • Cookie 生命控制
    • Cookie 有效路径
  • Session 会话
    • 创建和获取session
    • Session 域数据的存取
    • Session 生命周期控制
      • 浏览器和 Session 之间关联

Cookie

Cookie 是服务器通知客户端保存键值对的一种技术,客户端有了 Cookie 后,每次请求都发送给服务器并且每个 Cookie 的大小不能超过 4kb。

创建Cookie

  1. 创建一个新的servlet程序CookieServlet
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class CookieServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    	resp.setContentType("text/html;charset=utf-8");
        //1 创建Cookie 对象
        Cookie cookie = new Cookie("username", "root");
        //2 通知客户端保存Cookie
        resp.addCookie(cookie);
        //1 创建Cookie 对象
        Cookie cookie1 = new Cookie("password", "123456");
        //2 通知客户端保存Cookie
        resp.addCookie(cookie1);
        resp.getWriter().write("Cookie 创建成功");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

  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_4_0.xsd"
         version="4.0">
	<servlet>
        <servlet-name>CookieServlet</servlet-name>
        <servlet-class>CookieServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>CookieServlet</servlet-name>
        <url-pattern>/createCookie</url-pattern>
    </servlet-mapping>
</web-app>
  1. 启动服务器,测试cookie是否创建成功,http://localhost:8080/javaee_tomcat_war_exploded/createCookie
    在这里插入图片描述
    按F12,或者鼠标右击检查,选择应用程序,点开Cookie,查看到对应信息
    在这里插入图片描述

获取Cookie

  1. 创建一个工具类用来获取Cookie信息CookieUtils
import javax.servlet.http.Cookie;

public class CookieUtils {
    /**
     * 查找指定名称的Cookie 对象
     *
     * @param name
     * @param cookies
     * @return
     */
    public static Cookie findCookie(String name, Cookie[] cookies) {
        if (name == null || cookies == null || cookies.length == 0) {
            return null;
        }

        for (Cookie cookie : cookies) {
            if (name.equals(cookie.getName())) {
                return cookie;
            }
        }
        return null;
    }

}
  1. 创建一个新的servlet用来获取到Cookie信息
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class getCookieServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        Cookie[] cookies = req.getCookies();

        for (Cookie cookie : cookies) {
            // getName 方法返回Cookie 的key(名)
            // getValue 方法返回Cookie 的value 值
            resp.getWriter().write("Cookie[" + cookie.getName() + "=" + cookie.getValue() + "] <br/>");
        }

        Cookie mycookie = CookieUtils.findCookie("username", cookies);

        // 如果不等于null,说明赋过值,也就是找到了需要的Cookie
        if (mycookie != null) {
            resp.getWriter().write("找到了需要的 Cookie");
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

  1. 新增对应的映射文件信息
<?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_4_0.xsd"
         version="4.0">
	<servlet>
        <servlet-name>getCookieServlet</servlet-name>
        <servlet-class>getCookieServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>getCookieServlet</servlet-name>
        <url-pattern>/getCookie</url-pattern>
    </servlet-mapping>
</web-app>
  1. 启动项目进行访问。
    http://localhost:8080/javaee_tomcat_war_exploded/getCookie
    在这里插入图片描述
    这里我们直接获取到了cookie信息,这是因为我们之前的程序中存放了对应的cookie信息,如果我们换一个浏览器进行访问就访问不到之前的cookie信息了,这时我们可以重新调用一下http://localhost:8080/javaee_tomcat_war_exploded/createCookie这个请求,再获取cookie。

更新Cookie

更新cookie有俩种方法:

  • 先创建一个要修改的同名(指的就是 key)的 Cookie 对象,在构造器,同时赋于新的 Cookie 值,最后调用 response.addCookie( Cookie );
  • 先查找到需要修改的 Cookie 对象,调用 setValue()方法赋于新的 Cookie 值,调用 response.addCookie()通知客户端保存修改。

Cookie 生命控制

管理 Cookie 什么时候被销毁(删除)
通过Cookie对象中的setMaxAge()来控制Cookie的声明周期。

  • 正数,表示在指定的秒数后过期, cookie.setMaxAge(60 * 60);表示一小时后cookie失效
  • 负数,表示浏览器一关,Cookie 就会被删除(默认值是-1),cookie.setMaxAge(-1);表示浏览器一关cookie就会失效
  • 零,表示马上删除 Cookie,cookie.setMaxAge(-1);表示cookie马上就会失效。

Cookie 有效路径

Cookie 的 path 属性可以有效的过滤哪些 Cookie 可以发送给服务器。哪些不发。

  • cookie.setPath( req.getContextPath() + "/abc" ); 表示工程路径/abc路径下面的可以获取到cookie信息。
    

Session 会话

Session 就是一个接口(HttpSession),作为一个会话,它是用来维护一个客户端和服务器之间关联的一种技术。每个客户端都有自己的一个 Session 会话。

创建和获取session

通过HttpServletRequest中的getSession()方法来创建一个session对象,之后使用该方法都是获取到之前创建的session对象。

  • isNew(): 判断到底是不是刚创建出来的(新的)
  • getId(): 得到 Session 的会话 id 值。

Session 域数据的存取

  1. 定义俩个servlet程序,一个用来存入数据,一个用来取出数据

SessionServlet类

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

public class SessionServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        session.setAttribute("username","xiaoming");
        session.setAttribute("password","123456");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

getSessionServlet类

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

public class getSessionServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        String username = (String) session.getAttribute("username");
        String password = (String) session.getAttribute("password");
        System.out.println("用户名:" + username + ",密码:" + password);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

  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_4_0.xsd"
         version="4.0">
	<servlet>
        <servlet-name>SessionServlet</servlet-name>
        <servlet-class>SessionServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>SessionServlet</servlet-name>
        <url-pattern>/createSession</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>getSessionServlet</servlet-name>
        <servlet-class>getSessionServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>getSessionServlet</servlet-name>
        <url-pattern>/getSession</url-pattern>
    </servlet-mapping>
</web-app>
  1. 启动服务进行测试,先输入这个网站http://localhost:8080/javaee_tomcat_war_exploded/createSession进行数据的请求,再输入http://localhost:8080/javaee_tomcat_war_exploded/getSession进行数据获取。

在这里插入图片描述

Session 生命周期控制

  1. 通过HttpSession对象中的setMaxInactiveInterval()来设置 Session 的超时时间(以秒为单位)。
  • 值为正数的时候: 设定 Session 的超时时长。
  • 值为负数的时候: 永不超时
  1. 通过getMaxInactiveInterval()方法来获取 Session 的超时时间
  2. 通过invalidate()来让当前Session会话马上失效
  3. Session 默认的超时时间长为 30 分钟。这个是tomcat中的默认配置。这个设置可以进行修改
<!--表示当前web 工程。创建出来的所有Session 默认是20 分钟超时时长-->
<session-config>
	<session-timeout>20</session-timeout>
</session-config>

浏览器和 Session 之间关联

Session 技术,底层其实是基于 Cookie 技术来实现的。

  1. 当浏览器没有任何Cookie信息的时候,发请求到tomcat服务器时调用了HttpServletRequest对象的getSession()方法,这时服务器会创建一个Cookie对象,这个Cookie对象的key为JSESSIONID,值为新创建出来的Sessino的id值。
  2. 通过响应将该值传递给客户端,之后客户端每次请求的时候就会将id以Cookie的形式发送给服务器端。
  3. 服务器再获取HttpSession对象的时候就会通过Cookie中的id值来找到自己之前创建的Seesion对象。

欢迎java热爱者了解文章,作者将会持续更新中,期待各位友友的关注和收藏,另外对编程感兴趣的友友们可以加以下群共同学习。群号:127871664

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1947972.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入解析 GPT-4o mini:强大功能与创新应用

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文由 JohnKi 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f4e2;未来很长&#…

品牌故事线:如何在活动策划中保持品牌信息的连贯性?

在活动运营中保持品牌一致性和传达清晰的品牌信息&#xff0c;是确保活动成功并提升品牌形象的关键。 以下是一些具体的方法和建议。 码字不易&#xff0c;如果回答对你有所帮助&#xff0c;请不吝给一个三连哦&#xff01; 一、明确品牌定位与核心价值 首先&#xff0c;需…

一起刷C语言菜鸟教程100题(27-35)

先说明这个虽然菜鸟教程也有答案&#xff0c;但是这个专栏的博客是自己过手写了一遍&#xff0c;有自己的理解&#xff0c;有些习题自己是变化了一些&#xff0c;更适合练手&#xff0c;也会写的更普遍一些~ 今天我们一起继续刷题&#xff0c;链接放在这里供大家自行使用 C 语…

小红书(社招二面)算法原题

萝卜快跑涨价 距离我们上次谈 萝卜快跑 不足半月&#xff0c;萝卜快跑迎来了不少"反转"。 先是被曝远程后台有人操控&#xff0c;真实日成本超 400&#xff1a; 最近还被不少网友吐槽&#xff1a;萝卜快跑涨价了&#xff0c;如今价格和网约车持平。 据不少博主实测&a…

如何在 Windows 上安装并配置 VNC 远程连接树莓派,并结合Cpolar实现公网远程访问

目录 ⛳️推荐 前言 1. 使用 Raspberry Pi Imager 安装 Raspberry Pi OS 2. Windows安装VNC远程树莓派 3. 使用VNC Viewer公网远程访问树莓派 3.1 安装Cpolar步骤 3.2 配置固定的公网地址 3.3 VNC远程连接测试 4. 固定远程连接公网地址 4.1 固定TCP地址测试 ⛳️推荐…

FastAPI(六十九)实战开发《在线课程学习系统》接口开发--修改密码

源码见&#xff1a;"fastapi_study_road-learning_system_online_courses: fastapi框架实战之--在线课程学习系统" 之前我们分享了FastAPI&#xff08;六十八&#xff09;实战开发《在线课程学习系统》接口开发--用户 个人信息接口开发。这次我们去分享实战开发《在线…

【Linux操作系统】:进程间通信

目录 进程间通信介绍 1、进程间通信的概念 2、进程间通信的目的 3、进程间通信的本质 4、进程间通信的分类 管道 匿名管道 匿名管道的原理 pipe函数 创建匿名管道 管道的四种情况和五种特性 命名管道 使用命令创建命名管道 创建一个命名管道 命名管道的打开规则 …

Lc60---1189. “气球” 的最大数量(排序)---Java版

1.题目 2.思路 (1)用字典的方法,ballon,这个单词里面每个字母&#xff0c;需要的个数 (2)再创一个字典的方法统计&#xff0c;输入的字符串的字母的个数 (3)计算能拼凑出多少个“ballon" (4)代码解释 for (char c : text.toCharArray()) {count.put(c, count.getOrDefau…

【C++ —— AVL树】

C —— AVL树 AVL树的概念AVL树节点的定义AVL树的插入向上调整旋转左单旋右单旋左右双旋右左双旋 AVL树的高度AVL树的验证总结&#xff1a;代码 AVL树的概念 二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为单支树&#xff0c;查找元素…

在QT中使用多线程并发服务器(C++)

什么是多线程并发服务器&#xff1f;在QT里如何使用多线程并发服务器呢&#xff1f; 多线程并发服务器是一种网络服务器设计&#xff0c;它能够同时处理多个客户端的请求。在多线程服务器中&#xff0c;主线程负责监听和接受来自客户端的连接请求&#xff0c;每当有一个新的连…

DNS服务器的搭建

1、DNS服务器端软件 DNS 的域名解析都是 udp/53 . 主从之间的数据传输默认使 ⽤tcp/53 DNS服务器端软件&#xff1a; Bind是⼀款开放源码的DNS服务器软件&#xff0c;Bind由美国加州⼤学Berkeley&#xff08;伯克 利&#xff09;分校开发和维护的&#xff0c;全名为Berkele…

美容院如何提高门店销售业绩?博弈美业收银系统分享五大策略

美容院要如何增加门店业绩&#xff1f;各位老板可以考虑以下几个方面的策略&#xff1a; 一、品牌宣传和营销&#xff1a; • 制定全面的营销计划&#xff0c;包括线上和线下宣传。可以利用社交媒体、网站、本地广告等多种渠道提升品牌知名度。 • 开展促销活动吸引新客户&a…

PYTHON学习笔记(七、python数据结构--集合)

目录 &#xff08;4&#xff09;set集合 1、集合的创建方式 1&#xff09;使用{ }直接创建集合 2&#xff09;使用内置函数set( )创建集合 3&#xff09;使用“ 集合生成式 ”生成集合 2、集合的访问方式 1&#xff09;使用for循环遍历 3、集合的修改操作 4、集合的…

SvelteKit - 1. 初始化项目

官方 doc - create a project 1、基本环境 &#xff08;下面是我这里的环境&#xff0c;亲测用 node 14 和 16 install 会报错&#xff09; node&#xff1a;20.9.0 npm&#xff1a;10.1.0 2、初始化项目 npm create sveltelatest my-app cd my-app npm install npm run de…

本地部署、微调大模型

本地部署、微调大模型 一、本地部署大模型 1.部署 更新git-lfs apt-get updateapt-get install git-lfs2. 这里极容易出错&#xff0c;如果报错就初始化git git lfs install git init git lfs install3.下载ChatGLM-6B源代码 git clone https://github.com/THUDM/ChatGLM…

华为强制恢复出厂设置后如何恢复数据?数据重生的2个方法介绍

华为作为全球知名的手机品牌&#xff0c;其产品在市场上广受欢迎。然而&#xff0c;有时由于各种原因&#xff0c;我们可能需要强制恢复出厂设置&#xff0c;这往往意味着数据的丢失。那么&#xff0c;如何在华为强制恢复出厂设置后&#xff0c;让数据“重生”呢&#xff1f;本…

赋能安防摄像头云台:国产大功率机壳开关旭之源电源可靠、高效的优势

由GIS地图、图像采集、传输、控制、显示等设备和控制软件组成的“天网系统”通过对固定区域进行实时监控和信息记录&#xff0c;为社会治安和城市管理提供了强有力的支撑。 随着技术的不断革新和升级&#xff0c;天网技术逐渐拓展到全国范围&#xff0c;并在各个城市和乡村实现…

兼容浏览器,切换PC端显示PC端,切换H5端显示H5端

兼容浏览器&#xff0c;切换PC端显示PC端&#xff0c;切换H5端显示H5端 Uniapp vue3 Uview 项目 Vue3 Vite Ts ElementPlus PC端 &#xff08;在浏览器PC端&#xff0c;切换H5端兼容显示H5端页面&#xff09; 浏览器H5端 (在浏览器H5端&#xff0c;切换PC端兼容显示PC端…

【React】通过实际示例详解评论列表渲染和删除

文章目录 一、引言二、初始状态与状态更新1. 使用useState钩子管理状态2. 评论列表的初始数据 三、列表渲染的实现1. list.map(item > { ... })2. return 语句3. JSX 语法4. 为什么这样设计5. 完整解读 四、列表项的唯一标识1. key 的作用2. key 的用法3. 可以没有 key 吗&a…

SpringBoot整合Kaptcha实现图片验证码加减乘除

目录 SpringBoot整合Kaptcha实现图片验证码加减乘除1. 添加Kaptcha依赖2. 自定义文本生成器3. 配置Kaptcha4. 获取验证码图片的方法4.1. 详细讲解控制器中的切割操作 5. 总结 SpringBoot整合Kaptcha实现图片验证码加减乘除 在开发Web应用时&#xff0c;验证码是一个常见的功能…