Java研学-Cookie与Session

news2024/11/13 17:56:51

一 会话跟踪

1 HTTP 无状态

  HTTP 协议是无状态的,一问一答没有记忆,无法确定发出请求的用户身份。即各个请求的请求对象所包含的信息并不相同,一个会话中的多个请求之间无法共享数据,此时可以使用会话跟踪技术

2 会话跟踪技术

  Cookie 客户端会话跟踪技术
  Session 服务端会话跟踪技术(HttpSession)

3 案例

① 创建web项目,添加对应jar包(JSTL)
② login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录</title>
</head>
<body>
<form action="/http/login" method="post">
    <p>账号:<input type="text" name="username"></p>
    <p>密码:<input type="password" name="password"></p>
    <p><input type="submit" value="登录"></p>
</form>
</body>
</html>

③ LoginServlet.java

package http;

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 java.io.IOException;
@WebServlet("/http/login")
public class LoginServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req,
                           HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        if("admin".equals(username)&&"123".equals(password)){//登录成功
            req.setAttribute("username",username);
            req.getRequestDispatcher("/index.jsp").forward(req,resp);
        }
    }
}

④ index.jsp

<%--新建index.jsp,显示当前登录的用户名及提供点击查看收件箱--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
  <title>主页</title>
</head>
<body>
欢迎:${username} <br/>
<a href="/http/list">收件箱</a>
</body>
</html>

⑤ ListServlet.java

@WebServlet("/http/list")
public class ListServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        req.setAttribute("username",username);
        /*查询邮件列表信息*/
        List<String> list=new ArrayList<>();
        list.add("邮件一");
        list.add("邮件二");
        list.add("邮件三");
       req.setAttribute("list",list);
       req.getRequestDispatcher("/list.jsp").forward(req,resp);
    }
}

⑥ list.jsp

<%--显示当前用户名及其邮件,提供查询邮件内容--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
   <title>邮件列表</title>
</head>
<body>
欢迎:${username} <br/>
<c:forEach items="${list}" var="email">
   <a href="/http/content">${email}</a> <br/>
</c:forEach>
</body>
</html>

⑦ ContentServlet.java

@WebServlet("/http/content")
public class ContentServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        req.setAttribute("username",username);
        //跳转到详情页
        req.getRequestDispatcher("/content.jsp").forward(req,resp);
    }
}

⑧ content.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>邮件详情页</title>
</head>
<body>
<p>当前登录账号:${username}</p>
<p>这是邮件详情页面</p>
</body>
</html>

二 Cookie

1 概述

  Cookie(客户端技术)程序把各个用户的数据以 cookie 的形式写给用户各自的浏览器。(服务器创建Cookie存到客户端浏览器)当用户使用浏览器访问服务器中的 Web 资源时(再次访问服务器时实现数据共享),就会带着各自的数据到服务器。Web 资源此时处理的是用户各自的数据。
  传递方向:浏览器 -> 服务器(Cookie)-> 浏览器(存入)-> 服务器(获取Cookie 数据)
类似会员卡消费

2 创建 Cookie 对象

Cookie cookie = new Cookie (String name, String value)
属性方法描述
namegetName()共享数据名称(唯一)
valuegetValue()要共享的数据

3 响应 Cookie 给浏览器

// 使用响应对象中的 addCookie(Cookie 对象) 将数据响应给浏览器
resp.addCookie(cookie);

4 服务器端获取 Cookie

// 浏览器发请求时,自动将 Cookie 发送到服务器,服务器程序直接获取即可。
// 数据在请求中,使用请求对象中的 getCookies() 方法获取所有的 Cookie 对象。
Cookie[] cookies = request对象.getCookies();

5 修改 Cookie 数据

// 调用 Cookie 对象的 setValue 方法来覆盖原本的数据,或者重新创建一个同 name 的 Cookie 对象
cookie对象.setValue("大黄");

// 无论哪种方式,修改的都是服务器端内存中的 Cookie 数据,和浏览器中存的 Cookie 没有关系,所以需要重新响应新的 Cookie 到浏览器中进行更新。
resp.addCookie(新的Cookie对象);

6 Cookie 分类

Cookie 总是保存在客户端中,按在客户端中的存储位置,可分为内存 Cookie 和硬盘 Cookie。
内存 Cookie 由浏览器维护,保存在内存中,浏览器关闭后就消失了,其存在时间是短暂的。硬盘
Cookie 保存在硬盘里,有一个过期时间,除非用户手工清理或到了过期时间,硬盘 Cookie 不会被删
除,其存在时间是长期的。所以,按存在时间,可分为非持久 Cookie 和持久 Cookie。
默认情况下 Cookie 属于会话 Cookie,即浏览器关闭则失效,无法使用。

7 设置 Cookie 存活时间

// 在创建 Cookie 对象之后给其设置存活时间
Cookie对象.setMaxAge(int time);
expiry 数值例子含义
大于 0setMaxAge(60)Cookie 存活时间单位为秒
等于 0setMaxAge(0)立即删除当前 Cookie 对象
小于 0setMaxAge(-1)会话 Cookie,浏览器关闭则销毁

8 删除 Cookie

// 设置 Cookie 存活时间的方法即可进行删除,一般是中途删除 Cookie,不是创建后马上删除,所以在设置删除之后需要重新发送给浏览器去更新删除
Cookie对象.setMaxAge(0);
resp.addCookie(Cookie 对象);

9 例子

① login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录</title>
</head>
<body>
<form action="/cookie/login" method="post">
    <p>账号:<input type="text" name="username"></p>
    <p>密码:<input type="password" name="password"></p>
    <p><input type="submit" value="登录"></p>
</form>
</body>
</html>

② LoginServlet

@WebServlet("/cookie/login")
public class LoginServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req,
                           HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        if("admin".equals(username)&&"123".equals(password)){//登录成功
            /*登录成功将账号保存到客户端cookie*/
            /*name共享数据名称(唯一)  value要共享的数据*/
            /*new Cookie (String name, String value)*/
            Cookie cookie=new Cookie("username",username);
            Cookie cookie1=new Cookie("username","小黄");
            cookie.setValue("大黄");
           //设置有效时间
            cookie.setMaxAge(120);
            //设置路径
            cookie.setPath("/");
            resp.addCookie(cookie);
            resp.addCookie(cookie1);
            req.setAttribute("username",username);
            req.getRequestDispatcher("/index.jsp").forward(req,resp);
        }
    }
}

③ index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
  <title>主页</title>
</head>
<body>
欢迎:${username} <br/>
<a href="/cookie/list">收件箱</a>
</body>
</html>

④ ListServlet

@WebServlet("/cookie/list")
public class ListServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        /*获取cookie信息*/
        Cookie[] cookies = req.getCookies();
        if (cookies!=null){
            for (Cookie cookie : cookies) {
                // 获取账号的cookie
                if (cookie.getName().equals("username")){
                    // 删除cookie
                    cookie.setMaxAge(0);
                    resp.addCookie(cookie);
                  String username = cookie.getValue();
                    // 将账号存储到作用域
                  req.setAttribute("username",username);
                }
            }
        }
        /*查询邮件列表信息*/
        List<String> list = new ArrayList<>();
        list.add("邮件一");
        list.add("邮件二");
        list.add("邮件三");
        req.setAttribute("list", list);
        req.getRequestDispatcher("/list.jsp").forward(req, resp);
    }
}

⑤ list.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
   <title>邮件列表</title>
</head>
<body>
欢迎:${username} <br/>
   <p>当前登录账号:${cookie.username.value}</p>
<c:forEach items="${list}" var="email">
   <a href="/cookie/content">${email}</a> <br/>
</c:forEach>
</body>
</html>

⑥ ContentServlet

@WebServlet("/cookie/content")
public class ContentServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        /*获取cookie信息*/
        Cookie[] cookies = req.getCookies();
        if (cookies!=null){
            for (Cookie cookie : cookies) {
                //获取账号的cookie
                if (cookie.getName().equals("username")){
                    String username = cookie.getValue();
                    //将账号存储到作用域
                    req.setAttribute("username",username);
                }
            }
        }
        //跳转到详情页
        req.getRequestDispatcher("/content.jsp").forward(req,resp);
    }
}

⑦ content.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>邮件详情页</title>
</head>
<body>
<p>当前登录账号:${username}</p>
<p>这是邮件详情页面</p>
</body>
</html>

10 Cookie 的域和路径

① 作用
  使浏览器能够识别 Cookie 发送给对应的服务器,以及识别哪些请求需要携带 Cookie
  默认Cookie 都带了服务器的识别标识以及需要带 Cookie 的资源标识,保护Cookie 中的数据不被带到其他服务器中去。
② 域
  识别服务器,包含 IP:端口或域名:端口,可通过 Cookie 对象的 setDomain 方法设置。默认Cookie 中的域是创建 Cookie 的服务器的域名。域名分类:
一级(主)域名:bilibili.com
多级域名:news.bilibili.com
若想要在相同的主域名下来共享 Cookies 数据,例如,扣扣空间,扣扣音乐共用账号,则只需要
设置 Cookie 的 domain 即可。若主域不同,是无法共享 Cookie 数据。

cookie.setDomain(".bilibili.com");

③ 路径
  识别资源,可通过 Cookie 对象的 setPath 方法设置。默认为创建 Cookie 的资源的路径。
  例:/cookie/login 创建 Cookie,则 path 为 /cookie,则访问 /cookie 开头的资源都会携带该Cookie。
  若想要在访问服务器上的任意资源都带上 Cookie,则只需要在创建 Cookie 之后设置下 path 为 / 即可。

cookie.setPath("/");

④ 小结
若主域不同,不管 path 如何,都无法带上其他主域的 Cookie。
若主域相同,且 path 也为 /,则访问该域下的任意资源都会携带该域的 Cookie。

三 Session

1 概述

  Session 是服务器端技术(服务器创建,存在服务器),服务器运行时可为每个用户的浏览器创建一个其独享的 session 对象
  用户在访问服务器的 Web 资源时,可以把各自的数据放在各自的 session 中,当用户再去访问服务器中的其它 Web 资源时(再次访问服务器时实现数据共享),其它 Web 资源再从用户各自的 session 中取出数据为用户服务。(通过sessionId识别不同的浏览器用户)
原理图
  Session 底层依赖 Cookie 来传递 Session 的 id 值。所以浏览器关闭后 Session 就无法使用了(sessionId 丢失)。服务器会在 30 分钟内清除无操作的 Session 对象。存 sessionId 的 Cookie 为会话Cookie。

2 方法

① 获取session(HttpServletRequest的API)

方法作用
getSession(true)判断是否存在 Session,存在则获取,不存在则创建新 Session 对象返回
getSession(false)判断是否存在 Session,存在则获取,不存在则返回 null
getSession()存在则获取,不存在则创建新 Session 对象返回

② 数据共享(HttpSession的API)

方法作用
setAttribute(String name, Object value)设置属性名和属性值
getAttribute(String name)通过属性名去获取属性值
removeAttribute(String name)从 Session 中移除指定属性名的属性值
invalidate()移除整个 Session 对象,删除所有的属性和属性值

3 例子

① login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录</title>
</head>
<body>
<form action="/session/login" method="post">
    <p>账号:<input type="text" name="username"></p>
    <p>密码:<input type="password" name="password"></p>
    <p><input type="submit" value="登录"></p>
</form>
</body>
</html>

② LoginServlet

@WebServlet("/session/login")
public class LoginServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req,
                           HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        String password = req.getParameter("password");

        if("admin".equals(username)&&"123".equals(password)){//登录成功
            //账号存储session
            HttpSession session = req.getSession();
            //获取sessionid
            String id = session.getId();
            System.out.println(id);
            //设置超时时间
            session.setMaxInactiveInterval(60*5);
            session.setAttribute("username",username);
            req.getRequestDispatcher("/index.jsp").forward(req,resp);
        }
    }
}

③ index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
  <title>主页</title>
</head>
<body>
欢迎:${username} <br/>
<a href="/session/list">收件箱</a>
</body>
</html>

④ ListServlet

@WebServlet("/session/list")
public class ListServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        /*查询邮件列表信息*/
        List<String> list=new ArrayList<>();
        list.add("邮件一");
        list.add("邮件二");
        list.add("邮件三");
       req.setAttribute("list",list);
       // 从Session中获取数据
        System.out.println(req.getSession().getAttribute("username"));
       req.getRequestDispatcher("/list.jsp").forward(req,resp);
    }
}

⑤ list.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
   <title>邮件列表</title>
</head>
<body>
欢迎:${username} <br/>
<p>当前登录账号:${sessionScope.username}</p>
<c:forEach items="${list}" var="email">
   <a href="/session/content">${email}</a> <br/>
</c:forEach>
</body>
</html>

⑥ ContentServlet

@WebServlet("/session/content")
public class ContentServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 从session中获取数据
        System.out.println(req.getSession().getAttribute("username"));
        //跳转到详情页
        req.getRequestDispatcher("/content.jsp").forward(req,resp);
    }
}

⑦ content.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>邮件详情页</title>
</head>
<body>
<p>当前登录账号:${username}</p>
<p>这是邮件详情页面</p>
</body>
</html>

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

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

相关文章

用Java爬取新房二手房数据看总体大环境

都说现在房市惨淡&#xff0c;导致很多人在观望&#xff0c;那么今天我写一段爬虫&#xff0c;主要是抓取各地新房以及二手房成交状况&#xff0c;然后了解总体楼市是否回暖上升。 以下是Java爬虫程序的代码示例&#xff0c;用于抓取贝壳网新房和二手房数据&#xff1a; impor…

并发(11)

目录 71.ConcurrentHashMap JDK1.7说说其put的机制&#xff1f; 72.ConcurrentHashMap JDK1.7是如何扩容的&#xff1f; 73.ConcurrentHashMap JDK1.8实现的原理是什么&#xff1f; 74.ConcurrentHashMap JDK1.8是如何扩容的&#xff1f; 75.ConcurrentHashMap JDK1.8链…

Maven之私服

1 介绍 团队开发现状分析私服是一台独立的服务器&#xff0c;用于解决团队内部的资源共享与资源同步问题Nexus Sonatype公司的一款maven私服产品 下载地址&#xff1a;https://help.sonatype.com/repomanager3/download win版安装包&#xff1a;https://pan.baidu.com/s/1wk…

【tensorflowflutterweb】机器学习模型怎样用到前端上(未写完)

书接上回 在上一章 我们谈了怎么根据项目需求构建一个简单的机器学习模型。 ​​​​​​ ​​​​​​【tensorflow&flutter】自己写个机器学习模型用在项目上&#xff1f;-CSDN博客文章浏览阅读852次&#xff0c;点赞22次&#xff0c;收藏15次。【tensorflow&flutter…

结队编程 - 华为OD统一考试

OD统一考试 题解: Java / Python / C++ 题目描述 某部门计划通过结队编程来进行项目开发,已知该部门有 N 名员工,每个员工有独一无二的职级,每三个员工形成一个小组进行结队编程,结队分组规则如下: 从部门中选出序号分别为 i、j、k 的3名员工,他们的职级分别为 level[…

在docker中搭建部署clickhouse

因需要给网关日志拉取并存储供数据分析师分析&#xff0c;由于几十个项目的网关请求数量很大&#xff0c;放在mysql不合适&#xff0c;MongoDB不适合分析&#xff0c;于是准备存放在clickhouse&#xff0c;clickhouse对于读写支持也比较友好&#xff0c;说干就干 1、在服务器中…

6.综合案例

1. 需求描述 1.1 显示所有员工信息 URI:emps 请求方式:GET 显示效果 1.2 添加操作- 去往添加页面 显示添加页面: URI:emp 请求方式:GET 显示效果 1.3 添加操作- 添加员工 添加员工信息: URI:emp 请求方式:POST 显示效果:完成添加, 重定向到 list 页面。 1.4…

Java-网络爬虫(一)

文章目录 前言一、网络爬虫1. 介绍2. 爬虫协议3. 法律法规 二、相关知识1. HttpClient2. Jsoup 三、综合案例1. 案例一2. 案例二 四、总结 前言 下篇&#xff1a;Java-网络爬虫(二) 在大数据时代&#xff0c;信息采集是一项重要的工作&#xff0c;而互联网中的数据是海量的&am…

2024年第01周农产品价格报告

一、摘要 农产品价格监测主要涉及对畜禽类产品、水产品、蔬菜类产品、水果类产品的价格&#xff0c;以周为单位&#xff0c;进行变化情况的数据监测。其中&#xff0c;蔬菜类产品共18种&#xff0c;分别为大白菜、西红柿、黄瓜、青椒、芹菜、土豆、白萝卜、茄子、豆角、胡萝卜…

和可被K整除的子数组(Java详解)

目录 一、题目描述 二、题解 思路分析 具体实现 完整代码 一、题目描述 给定一个整数数组 nums 和一个整数 k &#xff0c;返回其中元素之和可被 k 整除的&#xff08;连续、非空&#xff09; 子数组 的数目。 子数组 是数组的 连续 部分。 示例&#xff1a; 输入&#…

MYSQL学习之buffer pool的理论学习

MYSQL学习之buffer pool的理论学习 by 小乌龟 文章目录 MYSQL学习之buffer pool的理论学习前言一、buffer pool是什么&#xff1f;二、buffer pool 的内存结构三、buffer pool 的初始化和配置初始化配置 四、buffer pool 空间管理LRU淘汰法冷热数据分离的LRU算法1.引入库2.读入…

【大数据进阶第三阶段之Datax学习笔记】阿里云开源离线同步工具Datax概述

【大数据进阶第三阶段之Datax学习笔记】阿里云开源离线同步工具Datax概述 【大数据进阶第三阶段之Datax学习笔记】阿里云开源离线同步工具Datax快速入门 【大数据进阶第三阶段之Datax学习笔记】阿里云开源离线同步工具Datax类图 【大数据进阶第三阶段之Datax学习笔记】使用…

RT-Thread 内核基础(一)

内核基础 包括&#xff1a;内核简介、系统的启动流程及内核配置的部分内容&#xff0c;为后面的章节奠定基础。 RT-Thread 内核介绍 内核是一个操作系统的核心&#xff0c;是操作系统最基础也最重要的部分。它负责管理系统的线程、线程间通信、系统时钟、中断及内存等。 下…

使用tailscale访问对端局域网上的其他设备

当tailscale客户端应用程序直接安装在组织中的每个客户端、服务器和虚拟机上时&#xff0c;Tailscale 效果最佳。这样&#xff0c;流量就会被端到端加密&#xff0c;并且无需配置即可在物理位置之间移动机器。 但是&#xff0c;在某些情况下&#xff0c;你不能或不想在每台设备…

AI人工智能学习路线图

学习人工智能 AI 的路线通常包括以下几个步骤&#xff1a;了解人工智能的基本概念和历史&#xff0c;包括机器学习、神经网络、深度学习等技术。学习数学基础知识&#xff0c;包括线性代数、微积分、概率论和统计学等。学习编程基础知识&#xff0c;包括 Python、C 等编程语言。…

[嵌入式AI从0开始到入土]10_yolov5在昇腾上应用

[嵌入式AI从0开始到入土]嵌入式AI系列教程 注&#xff1a;等我摸完鱼再把链接补上 可以关注我的B站号工具人呵呵的个人空间&#xff0c;后期会考虑出视频教程&#xff0c;务必催更&#xff0c;以防我变身鸽王。 第一章 昇腾Altas 200 DK上手 第二章 下载昇腾案例并运行 第三章…

源码编译部署篇(二)源码编译milvus成功后如何启动standalone并调试成功!

Milvus启动和调试 0 前言1 Milvus启动【问题描述】出现Aborted问题【问题分析】【解决方法】安装Pulsar服务执行单机启动命令解决监听端口号 2 Milvus调试编写launch.json验证单例调试成功 3 遇到的问题汇总问题1问题2:Permission denied 0 前言 由于Milvus官方文档只提及如何…

VX小程序Burp抓包

方法有很多&#xff0c;工具也各有差异&#xff0c;主要是学代理流量的思路 Burp流量代理工具小程序 一、Burp证书导入 1、开启代理 开启浏览器的代理&#xff0c;火狐推荐FoxyProxy&#xff0c;Google推荐SwitchyOmega&#xff0c;设置代理为127.0.0.1:8080。 2、下载证书…

[C#]Onnxruntime部署Chinese CLIP实现以文搜图以文找图功能

【官方框架地址】 https://github.com/OFA-Sys/Chinese-CLIP 【算法介绍】 在当今的大数据时代&#xff0c;文本信息处理已经成为了计算机科学领域的核心议题之一。为了高效地处理海量的文本数据&#xff0c;自然语言处理&#xff08;NLP&#xff09;技术应运而生。而在诸多N…

性能分析与调优: Linux 使用ELRepo升级CentOS内核

目录 一、实验 1.环境 2.agent 服务器使用ELRepo升级CentOS内核 二、问题 1. RHEL-7, SL-7 或者 CentOS-7系统如何安装ELRepo 2.RHEL-8或者RHEL-9系统如何安装ELRepo 一、实验 1.环境 &#xff08;1&#xff09;主机 表1-1 主机 主机架构组件IP备注prometheus 监测 系…