JavaWeb的小结03

news2024/12/23 6:00:39

第2章-第3节

一、知识点

Cookie、Session、Filter过滤器、Listener。

二、目标

  1. 理解Cookie和Session的区别。

  2. 掌握Cookie和Session的基本用法。

  3. 理解Filter过滤器的作用。

三、内容分析

  1. 重点

    • 理解Cookie和Session的区别。

    • 掌握Cookie和Session的基本用法。

    • 理解Filter过滤器的作用。

  2. 难点

    • 理解Cookie和Session的区别。

四、内容

1、Cookie

Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。

1.1 工作原理

客户端请求服务器后,如果服务器需要记录用户状态,服务器会在响应信息中包含一个Set-Cookie的响应头,客户端会根据这个响应头存储Cookie信息。再次请求服务器时,客户端会在请求信息中包含一个Cookie请求头,而服务器会根据这个请求头进行用户身份、状态等较验。

1.2 使用步骤
  1. 创建cookie对象

    new Cookie(String name, String value)

  2. 发送cookie对象

    (默认cookie的有效时间是整个浏览器关闭后才会销毁,哪怕服务器重启也不会没掉)

    response.addCookie(Cookie cookie)

  3. 获取cookie对象,拿到数据

    Cookie[] cookies = request.getCookies()

  4. 设置Cookie时效(单位:秒)(哪怕浏览器关闭了、电脑关闭了,只要时间没到,cookie就不会销毁)

    • 正数:cookie数据写入磁盘中,持久化存储 cookie.setMaxAge(60)。

       cookie.setMaxAge(60)
  - 负数:默认,当浏览器关闭的时候,cookie被销毁。
  - 0:删除cookie信息。

2、Session

Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。

2.1 工作原理

Session是依赖于Cookie的,当服务端创建session时,服务端在响应的时候会通知客户端把seesion id存储在cookie,后续的请求会在请求头里面会携带上cookie中的数据,服务端获取cookie携带的session id之后从session映射区里面获取对应的数据进行其他的操作。

2.2 使用步骤
  1. 获取session对象

    HttpSession session = request.getSession();
  2. 设置数据

    session.setAttribute(键, 值);
  3. 手动设置JSESSIONID,可以设置cookie时效性

    Cookie cookie = new Cookie("JSESSIONID", session.getId());
    cookie.setMaxAge(60 * 60);
    response.addCookie(cookie);

注意:

  1. Session是依赖于Cookie。

  2. 当客户端关闭后,服务器不关闭,两次获取的sessionid默认是不一样的,如果需要相同,可以创建cookie,键为JSESSIONID。

  3. 客户端没关闭,服务器关闭后,两次获取的sessionid默认不一样。

2.3 cookie和session的区别
  1. session用于存储一次会话的多次请求的数据,存在服务端。

  2. session可以存储任意类型,任意大小的数据。

  3. session数据存在服务端,cookie存在客户端。

  4. session没有数据大小限制,cookie有(一般是2K)。

  5. session数据安全,cookie相对不安全。

2.4 案例

场景:使用不同账号登录系统,返回的个人信息数据应该是不一样的。

打开两个不同的浏览器;

浏览器1:先调用http://localhost:8080/web/login?username=张三&password=123,再调用http://localhost:8080/web/userinfo,页面显示【张三】。

浏览器2:先调用http://localhost:8080/web/login?username=李四&password=123,再调用http://localhost:8080/web/userinfo,页面显示【李四】。

// 登录接口
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
​
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        String password = req.getParameter("password");
​
​
        HttpSession session = req.getSession();
        session.setAttribute("username", username);
​
        resp.setContentType("text/plain;charset=utf8");
        // 这里假设账号密码没有问题,直接返回登录成功
        resp.getWriter().write("登录成功");
    }
}
// 获取用户信息
@WebServlet("/userinfo")
public class UserInfoServlet extends HttpServlet {
​
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
​
        HttpSession session = req.getSession();
        String username = (String)session.getAttribute("username");
​
        resp.setContentType("text/plain;charset=utf8");
        resp.getWriter().write(username);
    }
}

3、Filter过滤器

访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊功能。比如可以用于完成通用的操作,如:登录验证、统一编码处理、敏感字符过滤等等。

3.1 使用步骤
  1. 定义一个类,实现接口javax.servlet.Filter。

  2. 重写方法。

  3. doFilter方法实现通用操作。

  4. 配置拦截路径。

    • 第一种:web.xml配置

      <filter>
          <filter-name>demo</filter-name>
          <filter-class>com.test.web</filter-class>
      </filter>
      <filter-mapping>
          <filter-name>demo</filter-name>
          <url-pattern>/*</url-pattern>
      </filter-mapping>
    • 第二种:使用注解

      @WebFilter("路径")
3.2 应用示例

统一处理请求编码格式代码如下:

@WebFilter("/*")
public class MyFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
​
    }
​
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        // 统一设置请求编码格式
        servletRequest.setCharacterEncoding("utf8");
        // 放行,不然就卡在这里了
        filterChain.doFilter(servletRequest, servletResponse);
    }
​
    @Override
    public void destroy() {
​
    }
}

4、Listener

监听器用于监听web应用中某些对象、信息的创建、销毁、增加、修改、删除等动作的发生,然后作出响应的响应处理。当范围对象的状态发生变化的时候,服务器自动调用监听器对象中的方法。

4.1 ServletContext对象监听器

监听web上下文的初始化(服务器已经准备好接收请求)与销毁,通常用来加载框架的配置文件。

  1. 注解

    @WebListener//监听器标识,加载到项目中
    public class MyListener implements ServletContextListener {
    ​
        @Override
        public void contextInitialized(ServletContextEvent sce) {
            // TODO Auto-generated method stub
            // 用来加载框架xml配置文件
            //作用:存放在项目启动的前需要执行的逻辑
            System.out.println("Servlet初始化");
    ​
        }
    ​
        @Override
        public void contextDestroyed(ServletContextEvent sce) {
            // TODO Auto-generated method stub
    ​
        }
    ​
    }
  2. web.xml配置

    <listener>
        <listener-class>com.test.web.MyListener</listener-class>
    </listener>
4.2 其他监听器
  1. HttpSession对象监听器:监听session建立与销毁

  2. HttpSessionAttributeListener:监听session属性的增加、移除、以及属性值得改变

  3. ServletRequest对象监听器:监听request的创建于销毁

5、解决跨域问题

resp.setHeader("Access-Control-Allow-Origin", "*");
resp.setHeader("Access-Control-Allow-Methods", "*");
resp.setHeader("Access-Control-Max-Age", "3600");
resp.setHeader("Access-Control-Allow-Headers", "*");

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

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

相关文章

minio简单使用

文章目录 简介官方地址Linux下载安装安装服务启动关闭帮助命令 java开发minio依赖包新建项目pom配置文件配置类Service测试类运行测试 Api使用前言针对桶的操作查看某个桶是否存在创建一个桶返回桶列表删除一个桶 针对文件的操作上传文件到桶中(本地文件上传)上传文件到桶中(基…

(Linux驱动学习 - 9).设备树下platform的LED驱动

一.platform相关结构体与函数 1.匹配列表 - struct of_device_id struct of_device_id {char name[32];char type[32];/* compatible 很重要&#xff0c;需要与设备树节点的 compatible 属性一致&#xff0c;才能匹配 */char compatible[128]; const void *data; }; …

dfs 判重Sequence one——hdu 2610

目录 前言 搜索算法判重 map判重 set判重 Sequence one 问题描述 输入 输出 数据范围 样例 问题分析 重构dfs参数 递减&#xff0c;不重复 去重的优化 最终代码 前言 搜索算法判重 搜索算法判重有很多种方法&#xff0c;常见的有两种&#xff0c;map判重和set判重…

模运算和快速幂

文章目录 模运算快速幂 模运算 模运算是大数运算中的常用操作。如果一个数太大&#xff0c;无法直接输出&#xff0c;或者不需要直接输出&#xff0c;则可以对它取模&#xff0c;缩小数值再输出。取模可以防止溢出&#xff0c;这是常见的操作。 取模运算一般要求a和m的符号一…

VCI_VBDSP使用教程-服务站

VCI_VBDSP使用教程-服务站 VBDSP软件压缩包请点击下载&#xff1a;(备注&#xff1a;将VBDSP软件压缩包做一个下载连接&#xff0c;放到此处) 教程视频&#xff1a;https://www.bilibili.com/video/BV19eHpeeEiz/?spm_id_from333.999.0.0&vd_source224b4434f72960113bc97…

数组的定义与使用(二)

2. 数组是引用类型 2.1初识JVM的内存分布 内存是一段连续的存储空间&#xff0c;主要用来存储程序运行时数据的。比如&#xff1a; 程序运行时代码需要加载到内存程序运行产生的中间数据要存放在内存程序中的常量也要保存有些数据可能需要长时间储存&#xff0c;有些数据当方…

PCL 平面点云边界特征提取(alpha shapes)

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 点云边界提取 2.1.2 可视化点云与边界 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接&#xff1a; PCL点云算法与项目实战案例汇总&#xff08;长期更新&a…

07:(寄存器开发)串口通信

串口通信 1、串口简介2、串口通讯协议3、硬件外设4、发送数据5、使用轮询的方式接收数据&#xff08;USART1&#xff09;6、使用中断的方式接收数据7、串口进行printf重定向 1、串口简介 串口通讯&#xff08;Serial Communication&#xff09;是一种设备间非常常用的串行通讯方…

后端增删改查的基本应用——一个简单的货物管理系统

最终效果&#xff0c;如图所示&#xff1a; 如果想要进行修改操作&#xff0c;可点击某栏修改选项&#xff0c;会在本表格下方弹出修改的具体操作界面&#xff08;点击前隐藏&#xff09;&#xff0c;并且目前的信息可复现在修改框内。 本篇文章通过该项目将后端和前端结合起来…

java内存控制

Java 内存控制是一个相对复杂但至关重要的主题&#xff0c;它涉及到如何高效地管理Java应用程序中的内存资源。在Java中&#xff0c;内存管理主要由Java虚拟机&#xff08;JVM&#xff09;负责&#xff0c;包括内存的分配和回收。尽管如此&#xff0c;作为开发者&#xff0c;我…

2025年5月高项,从0备考信息系统项目管理师 | 备考经验全攻略分享

在逐步摸索备考信息系统项目管理师的过程中&#xff0c;我总结了很多关于班课资料和学习经验&#xff0c;现在与大家分享。&#xff08;全文约3k字&#xff0c;阅读用时约5min&#xff09; 这篇分享帖不仅告诉你关于备考信息系统项目管理师实用的班课资料&#xff0c;还有学习…

Win11 23H2 10月正式版:22631.4317 镜像免费下载!

今日&#xff0c;系统之家小编给您带来2024年10月最新更新的Windows11 23H2正式版系统下载&#xff0c;该版本系统基于微软官方最新Windows11 23H2 22631.4317专业版展开离线制作&#xff0c;没有病毒残留&#xff0c;且能完美支持新老机型&#xff0c;安装后&#xff0c;系统版…

【概率论】泊松分布

泊松分布 若 &#xff0c;则 归一性 例子 泊松分布多出现在当X表示一定时间或一定空间内出现的事件的个数这种场合&#xff0c;如在一定时间内某交通路口所发生的事故的个数。 将泊松分布假设为二项分布 假设条件: &#xff08;1&#xff09;泊松分布一般为一段时间或一…

★ 算法OJ题 ★ 二分查找算法

Ciallo&#xff5e;(∠・ω< )⌒☆ ~ 今天&#xff0c;塞尔达将和大家一起做几道二分查找算法算法题 ~ ❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️ 澄岚主页&#xff1a;椎名澄嵐-CSDN博客 算法专栏&#xff1a;★ 优选算法100天 ★_椎名澄嵐的博客-CSDN博客…

STM32 SPI串行总线

目录 STM32的SPI通信原理 SPI串行总线概述 SPI串行总线互连方式 STM32F1 SPI串行总线的工作原理 SPI串行总线的特征 SPI串行总线的内部结构 SPI串行总线时钟信号的相位和极性 STM32的SPI接口配置 STM32的SPI接口数据发送与接收过程 SPI的HAL 驱动函数 STM32的SPI通信…

靶标弹孔检测系统源码分享

靶标弹孔检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision …

apt update报错:ModuleNotFoundError: No module named ‘apt_pkg‘(可能是默认python版本被改坏了)

文章目录 错误信息分析1. 确保 apt_pkg 模块已安装2. 检查 Python 版本3. 重新配置 Python4. 修复损坏的依赖5. 检查环境变量 尝试 错误信息 (base) rootkyai:/ky/tml/ky_ai_get_server_info# apt update 获取:1 file:/var/cuda-repo-cross-aarch64-ubuntu2004-11-4-local InR…

【Python】如何让SQL Server像MySQL一样拥有慢查询日志(Slow Query Log慢日志)

如何让SQL Server像MySQL一样拥有慢查询日志&#xff08;Slow Query Log慢日志&#xff09; SQL Server一直以来被人诟病的一个问题是缺少了像MySQL的慢日志功能&#xff0c;程序员和运维无法知道数据库过去历史的慢查询语句。 因为SQLServer默认是不捕获过去历史的长时间阻塞…

inBuilder低代码平台新特性推荐-第二十五期

今天来给大家带来的是inBuilder低代码平台社区版中的特性推荐系列第二十五期——选人组件扩展&#xff01; 一、概述 inBuilder低代码平台社区版的开发过程中&#xff0c;选人组件支持tab页中增加扩展页面&#xff0c;由二开人员根据业务场景实现自定义取数接口和页面展示形式…

【笔记】济南,天命人,春秋

孤独而高傲的济南人 浩克山东知天命热爱的sensei 浩克山东 哦哦&#xff0c;最高的大葱也是济南的了&#xff0c;这大葱&#xff0c;比一般人要高呢&#xff0c;尽管济南的朋友们也都个子不矮。。能想像的到两米高的米库。。。。 然而在这块地界&#xff0c;遇到个人&#xf…