Servlet编程---Day 07

news2025/1/10 21:48:03

目录

一、过滤器概述

二、过滤器使用

(一)开发第一个过滤器

(二)过滤器的生命周期

(三)FilterChain(过滤器链)

1.过滤器链认识

2.过滤器链代码实现

3.过滤器链顺序

(四)请求的细节

1.请求转发过滤(不再过滤)

2.重定向过滤(重新过滤)

3.配置拦截请求方式

案例:实现登录过滤

一、过滤器概述

        1.什么是过滤器拦截器

        生活中的过滤器:: 净水器 , 空气净化器,渔网等
        web中的过滤器: Filter 过滤器
        2.Filter过滤器 ,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截。简单说,就是可以实现web 容器对某资源的访问前截获进行相关的处理,还可以在 web 容器向浏览器返回响应前进行截获处理。
        拦截与修改我们的请求与响应。比如:不合时宜的话,会进行屏蔽***

二、过滤器使用

(一)开发第一个过滤器

        第一步: 写一个过滤器 ( 新建一个普通的类 , 这个类去实现 Filter 接口 )
        init(FilterConfig config)方法 -- 以前 Servlet 里面方法是访问的时候初始化,但是过滤里面初始化方法是 tomcat启动的时候初始化。doFilter是过滤器的核心方法。destory是销毁方法
        第二步: 配置 XML 文件
<filter>
        <filter-name>myFilter02</filter-name>
        <filter-class>com.day07.MyFilter02</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>myFilter02</filter-name>
<!--        设置要拦截的请求-->
        <url-pattern>/*</url-pattern>
<!--        只拦截请求转发-->
        <dispatcher>FORWARD</dispatcher>
    </filter-mapping>
        /* 路径匹配 对所有的请求都过滤
        /user/* 对 user 包下所有路径都过滤
        *.jsp 后缀名匹配 ,过滤所有 jsp 文件
        *.do 后缀名匹配,只拦截 servlet ,但是 servlet 映射需要加后缀 .do

(二)过滤器的生命周期

        创建-> 初始化 -> 执行 [ 每次过滤都执行 ]-> 销毁 ( 正常关闭时 )
        与servlet的生命周期对比
        Servlet:当 第一次访问 的时候才进行创建与初始化 ( 可以配置 )
        Filter:在 服务器 (tomcat) 启动的时候 就进行创建与初始化 ( 可以配置 )
        Servlet Init初始化:第一次访问的时候 只执行一次
        Filter Init初始化: 服务器 (tomcat) 启动的时候 只执行一次
        Servlet:用来完成我们的功能 ( 三大职责 )
        Filter:用来过滤的 ( 完成一个公共的过滤的功能 )
        Destroy销毁:服务器关闭或项目移除,只执行一次

(三)FilterChain(过滤器链)

1.过滤器链认识

        过滤器链: 多个过滤器形成的一组过滤器 , 然后我们在访问最终的资源的时候会经过这一组过滤器 , 在返回的时候还会经过这一组过滤器。

2.过滤器链代码实现

        (1)创建3个过滤器

        (2)创建3个Filter
        (3)WEB.xml里面配置
        过滤器链一定要 放行 :chain.doFilter(req, resp);

3.过滤器链顺序

        过滤器链的顺序由filter-mapping 的顺序决定

(四)请求的细节

1.请求转发过滤(不再过滤)

        默认的拦截 是通过拦截请求的
        当是请求转发的时候,由于是一次请求,所以拦截一次;

2.重定向过滤(重新过滤)

        当重定向的时候,由于是两次请求,所以过滤2 ;

3.配置拦截请求方式

        注意: 默认是一次请求拦截( REQUEST 的方式)
        Servlet中请求转发:过滤器拦截 1
        Servlet中重定向:过滤器拦截 2
        Filter中请求转发:需要不放行
        Filter中重定向:造成无限循环重定向

案例:实现登录过滤

LoginServlet.java 

package com.day07; /**
 * @Author: 小麦穗呀
 * @Date: 2023-5-17 10:51
 * @Version: 1.0
 */

import com.day07.pojo.User;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;

@WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        //接受前端数据
        String username = request.getParameter("username");
        String psd = request.getParameter("psd");

        //校验信息是否正确
        if ("aaa".equals(username) && "123".equals(psd)){
            User user = new User(username,psd);
            HttpSession session = request.getSession();
            session.setAttribute("userList",user);
            //信息正确跳转到成功页面
            request.getRequestDispatcher("success.jsp").forward(request,response);
        }else {
            //信息错误跳转到登陆界面,并友好提示
            request.setAttribute("msg","用户名或密码输入错误");
            request.getRequestDispatcher("login.jsp").forward(request,response);
        }
    }

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

User.java

package com.day07.pojo;

/**
 * @Author: 小麦穗呀
 * @Date: 2023-5-18 11:16
 * @Version: 1.0
 */
public class User {
    private String username;
    private String password;

    public User() {
    }

    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

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

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

相关文章

【C++进阶】多态详解(上)

文章目录 一、多态的概念二、多态的定义及实现1.多态的构成条件2.虚函数3.虚函数的重写(1)虚函数重写概念(2)虚函数重写的两个例外&#xff1a;(3)析构函数是否要定义为虚函数(4)C11 override 和 final 三、抽象类1.概念2.接口继承和实现继承 四、多态的原理1.虚函数表2.多态的…

各种常见的word格式符号(回车字符、软回车、分页符等)

一、如何显示编辑符号 1、打开WORD-选项-显示&#xff0c;勾选格式标记 2、如下图所示。在【开始】一【段落】选项卡中&#xff0c;它可以帮助我们识别编辑过程中的格式符号。 二、各种常见的word格式符号 第一种 描述&#xff1a;向下的箭头 样式&#xff1a;↓ 名字&#xff…

Esbuild基本使用与插件开发

作为Vite的双引擎之一&#xff0c;Esbuild在很多关键的构建阶段(如依赖预编译、TS语法转译、代码压缩)让Vite获得了相当优异的性能&#xff0c;是Vite高性能的得力助手。无论是在Vite的配置项还是源码实现&#xff0c;都包含了不少Esbuild的基本概念和高阶用法。因此&#xff0…

idea线上debug

idea线上debug 1. 为什么需要线上debug2. 基本原理3.远程调试配置3.1 1. 融合云增加JVM参数3.2 idea配置 4. 注意附录 1. 为什么需要线上debug 在微服务开发中&#xff0c;开发的服务可能会依赖数据库、消息队列等资源&#xff0c;也有可能依赖其他的服务&#xff0c;这些服务…

PCB 布线技术~PCB 基础

PCB量测的单位 • PCB设计起源于美国&#xff0c;所以其常用单位是英制&#xff0c; 而非公制 – 版子的大小通常使用英尺 – 介质厚度&导体的长宽通常使用英尺及英寸 • 1 mil 0.001 inches • 1 mil .0254 mm – 导体的厚度常使用盎司(oz) • 一平方英尺金属的重量 •…

redis学习(十八) 部署redis哨兵模式

文章目录 前言一、搭建主从数据库二、搭建哨兵三、验证哨兵 前言 哨兵模式核心还是主从复制&#xff0c;只不过在相对于主从模式在主节点宕机导致不可写的情况下&#xff0c;多了一个竞选机制&#xff1a;在所有的从节点竞选出新的主节点。每一个哨兵都是一个独立的sentinel进…

PCB 布线技术~PCB结构:Traces,电源平面

PCB导体:Traces • 铜是PCB中最常用的导体 – 走线或连接器一般通过镀金来提供一个抗腐蚀的电传导特性 – 走线的宽度和长度-由PCB布线工程师控制 • 在通常的制造工艺下&#xff0c;走线的宽度和之间的间距一般要≥5 mil – 走线厚度-制造工艺的变量 • 典型值 0.5oz – 3oz •…

Linux---目录结构、绝对路径与相对路径、命令基础格式、ls命令

1. Linux的目录结构 Linux的目录结构是一个树型结构。 Windows 系统可以拥有多个盘符, 如 C盘、D盘、E盘。 Linux没有盘符这个概念, 只有一个根目录 /, 所有文件都在它下面。 在Linux系统中&#xff0c;路径之间的层级关系&#xff0c;使用&#xff1a;/ 来表示。 Linux只…

Inodb引擎 内存+磁盘+MVCC(多版本并发控制)

目录 逻辑存储结构 Innodb引擎内存结构介绍 Innodb引擎磁盘结构介绍 内存和磁盘交互 MVCC(多版本并发控制)原理 预备知识 mvcc基本概念 mvcc的具体实现 总的来说mvcc原理&#xff1a; 逻辑存储结构 Innodb引擎内存结构介绍 Buffer Pool(缓冲池) 缓冲池是内存的一个区域&am…

001 hive简介

一. hive概述 1. hive的产生背景 mapreduce程序大部分解决的问题是结构化数据&#xff0c;而解决结构化数据最佳方案是一条sql语句 hive出现的主要原因是解决mapreduce开发成本高的问题。但hive不能完全替代mr&#xff0c;只能处理mr中的结构化数据。 2. hive是什么 hive提…

【数据结构】常见数据结构汇总

文章目录 前言一、数组二、链表三、栈四、队列五、哈希表--散列表六、堆七、树八、图参考与感谢 前言 数据结构是计算机存储、组织数据的方式。一种好的数据结构可以带来更高的运行或者存储效率。数据在内存中是呈线性排列的&#xff0c;但是我们可以使用指针等道具&#xff0…

hive学习入门

第四章 HQL基础语法 Hive中的语句叫做HQL语句,是一种类似SQL的语句,基本上和SQL相同但是某些地方也是有很大的区别. 4.1 数据库操作 创建数据库 1.创建一个数据库,数据库在HDFS上的默认存储路径是/hive/warehouse/*.db。 create database hive01; 避免要创建的数据库已经存…

算法设计与分析:分治法

目录 第1关&#xff1a;分治法介绍 任务描述&#xff1a; 相关知识&#xff1a; 基本概念&#xff1a; 解题步骤&#xff1a; 实例演示&#xff1a; 关键代码&#xff1a; 编程要求&#xff1a; 测试说明&#xff1a; 第2关&#xff1a;归并排序 任务描述&#xff1a;…

网安行业「iPhone时刻」!深信服首秀安全GPT技术应用

5月18日&#xff0c;深信服正式对外首秀安全GPT技术应用。深信服科技董事长何朝曦在现场分享了安全GPT技术应用的研发背景、技术应用特点及未来设想。深信服科技研发总经理梁景波、深信服安全攻防专家演示了安全GPT技术应用在XDR平台上的效果&#xff0c;包括高级威胁检测、安全…

Midjourney8种风格介绍+使用场景(2)

引言 我相信大家都或多或少玩过Midjourney&#xff0c;但是要形成自己独特的个人IP&#xff0c;那么有必要知晓画作的一些基础知识&#xff0c;如果你没有时间实践&#xff0c;没有关系&#xff0c;我来操作&#xff0c;定期分享画作相关知识&#xff0c;既简单又方便&#xff…

软件测试面试常常遇到的十大“套路”

面试中&#xff0c;如何回答HR提出的问题很大程度上决定了面试能不能成功。 下面是软件测试人员在面试过程中经常被问到的10个问题&#xff0c;告诉你怎么回答才不会被面试官套路...... 一、请你做一个自我介绍 误区&#xff1a; 一般人回答这个问题过于平常&#xff0c;只说…

5th-Generation Mobile Communication Technology(四)

目录 一、5G/NR 1、 快速参考&#xff08;Quick Reference&#xff09; 2、5G Success 3、5G Challenges 4、Qualcomm Videos 二、PHY and Protocol 1、Frame Structure 2、Numerology 3、Waveform 4、Frequency Band 5、BWP 6、Synchronization 7、Beam Management 8、CSI Fra…

闭包?什么是闭包?--JavaScript前端

大厂面试题分享 面试题库 前后端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 web前端面试题库 VS java后端面试题库大全 闭包的背景 由于js中只有两种作用域&#xff0c;全局作用域和函数作用域&#xff08;模块…

模拟封装C标准库

文章目录 1. 准备工作2. my_fopen3. my_fwrite4. my_fclose和my_fflush5. syncfs 1. 准备工作 举个例子&#xff1a; 这里我们要实现my_fopen&#xff0c;my_fwrite和my_fclose这三个函数&#xff0c;并封装MyFILE。 这是MyFILE的封装&#xff0c;然后我们把三个函数接口完成…

Seaborn 可视化学习

Abstract 主要讲述绘制强化学习结果时遇到的seaborn操作。因此&#xff0c;本文主要讲述Lineplot的用法&#xff0c;以及图片的相关设置 线条绘制 import seaborn as sns import pandas as pd import matplotlib.pyplot as plt import numpy as np# 单线绘制 data pd.DataF…