servlet过滤器Filter简要回顾-过滤请求字符编码,/和/*和/**的区别

news2024/10/7 6:42:21

servlet过滤器Filter简要回顾-过滤请求字符编码,/和/*和/**的区别

  • servlet过滤器
    • 1.filter过滤器的含义
    • 2.filter过滤器的使用
    • 3.测试-过滤字符编码正确响应中文编码
      • 3.1 创建servlet用于显示中文字符
      • 3.2 自定义过滤器
      • 3.3 配置web.xml中的servlet映射以及过滤器请求拦截
      • 3.4 运行输出
    • 4. / 和 /* 以及 /** 的区别

servlet过滤器

1.filter过滤器的含义

它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理。使用Filter的完整流程:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。servlet的过滤器,通过实现Filter接口来实现。

过滤器的本质:过滤一些非法请求(常见的场景就是非法登录验证,以及一些需要登录后才能去访问的页面和资源),在浏览器和服务器响应中间添加一个拦截过滤请求的容器。

比如针对非法登录的用户的请求过滤:
当我们使用了Filter过滤器的时候,同样的场景,用户每一次发送请求的时候都要经过Filter过滤器,那么我们可以在过滤器里面编辑逻辑代码,进行判断当用户没有登录的时候,我们就让他跳转到提示错误的页面,在提示错误的页面里提示他只有登录了之后才可以访问系统主页。

在这里插入图片描述

2.filter过滤器的使用

首先,需要引入对应的包 javax.servlet,和HttpServlet是同一个包下。

filter接口源码:

package javax.servlet;

import java.io.IOException;

public interface Filter {
    default void init(FilterConfig filterConfig) throws ServletException {
    }

    void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException;

    default void destroy() {
    }
}

创建一个类,实现filter接口,并且重写它的三个方法即可:

package com.robin.filter;

import javax.servlet.*;
import java.io.IOException;

public class MyFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        Filter.super.init(filterConfig);
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        // 编写自己的业务逻辑代码即可
    }

    @Override
    public void destroy() {
        Filter.super.destroy();
    }
}

接着,去web.xml中配置过滤器:

 	<!--  过滤器配置  -->
    <filter>
     	<!-- 过滤器名 -->
        <filter-name>MyFilter </filter-name>
         <!--过滤器对应的全类名 -->
        <filter-class>com.robin.filter.MyFilter</filter-class>
    </filter>
    <!--过滤器拦截请求映射 -->
    <filter-mapping>
    	<!-- 过滤器名与上面的一致 -->
        <filter-name>MyFilter </filter-name>
        <!--   过滤请求配置 下面的相当于过滤servlet包下的所有请求   -->
        <url-pattern>/servlet/*</url-pattern>
    </filter-mapping>

3.测试-过滤字符编码正确响应中文编码

3.1 创建servlet用于显示中文字符

package com.robin.servlet;

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

public class ShowServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().write("我是中文字符");
    }

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

3.2 自定义过滤器

package com.robin.filter;

import javax.servlet.*;
import java.io.IOException;

/**
 * 自定义字符过滤器
 */
public class CharacterEncodingFilter implements Filter {

    // 过滤器初始化
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("CharacterEncodingFilter初始化");
        Filter.super.init(filterConfig);
    }

    //
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        // 设置过滤器的功能
        servletRequest.setCharacterEncoding("utf-8");
        servletResponse.setCharacterEncoding("utf-8");
        servletResponse.setContentType("text/html;charset=utf-8");

        System.out.println("CharacterEncodingFilter过滤器执行之前");
        // 将自定义过滤器加入过滤器链中 filterChain 如果不加入链中,是无法执行过滤器的功能,以及拦截请求
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("CharacterEncodingFilter过滤器执行之后");
    }

    // 过滤器销毁
    @Override
    public void destroy() {
        System.out.println("CharacterEncodingFilter销毁");
        Filter.super.destroy();
    }
}

3.3 配置web.xml中的servlet映射以及过滤器请求拦截

<?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>
        <servlet-name>ShowServlet</servlet-name>
        <servlet-class>com.robin.servlet.ShowServlet</servlet-class>
    </servlet>
    <!-- 配置第一个映射,走过滤器的映射   -->
    <servlet-mapping>
        <servlet-name>ShowServlet</servlet-name>
        <url-pattern>/servlet/Show</url-pattern>
    </servlet-mapping>
    <!--  第二个映射,不走过滤器,则显示字符会乱码  -->
    <servlet-mapping>
        <servlet-name>ShowServlet</servlet-name>
        <url-pattern>/Show</url-pattern>
    </servlet-mapping>
    
    <!--  过滤器配置  -->
    <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>com.robin.filter.CharacterEncodingFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <!--   过滤servlet下的所有请求     -->
        <url-pattern>/servlet/*</url-pattern>
    </filter-mapping>
</web-app>

3.4 运行输出

先访问走过滤器的请求http://localhost:8080/servlet/Show,字符正确显示

在这里插入图片描述

访问不会走过滤器的请求http://localhost:8080/Show,则输出乱码

在这里插入图片描述

其余的非法登录验证,以及敏感字符请求过滤等,本质都一样,大家可以自行测试

4. / 和 /* 以及 /** 的区别

  1. /
    <url-pattern>/</url-pattern>
    解释:会匹配到/login这样的路径型url,.js和.html等静态资源,不会匹配到*.jsp页面

  2. /*
    <url-pattern>/*</url-pattern>
    解释:会匹配所有url(只匹配当前文件夹下文件,不匹配子文件夹下文件),包括*.jsp页面

  3. /**
    <url-pattern>/**</url-pattern>
    解释:会匹配所有url(匹配当前文件夹下文件和子文件夹下文件):路径型的和后缀型的url(包括/login,.jsp,.js和*.html等)


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

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

相关文章

【编程入门】开源记事本(安卓版)

背景 前面已输出多个系列&#xff1a; 《十余种编程语言做个计算器》 《十余种编程语言写2048小游戏》 《17种编程语言10种排序算法》 《十余种编程语言写博客系统》 《十余种编程语言写云笔记》 本系列对比云笔记&#xff0c;将更为简化&#xff0c;去掉了网络调用&#xff0…

第二章 物理层

第二章 物理层 2.1 物理层的基本概念 物理层考虑的是怎样才能在连接各种就算机的传输媒体上传输数据比特流&#xff0c;而不是指具体的传输媒体 物理层的主要任务描述为确定与传输媒体的接口有关的一些特性 机械特性 指明接口所用接线器的形状和尺寸&#xff0c;引脚数目和排…

辗转相除以及辗转相减法

文章目录前言辗转相除法&#xff08;又名欧几里算法&#xff09;辗转相减法&#xff08;又名更相减损法&#xff09;原始辗转相减法改版辗转相减法&#xff08;减的是指数&#xff09;参考文章前言 在学习Acwing c蓝桥杯辅导课第八讲数论-AcWing 1223. 最大比例时有使用到求指…

使用CNN进行2D路径规划

卷积神经网络(CNN)是解决图像分类、分割、目标检测等任务的流行模型。本文将CNN应用于解决简单的二维路径规划问题。主要使用Python, PyTorch, NumPy和OpenCV。 任务 简单地说&#xff0c;给定一个网格图&#xff0c;二维路径规划就是寻找从给定起点到所需目标位置&#xff0…

如何取消PDF文件的保护设置?

PDF文件可以设置两种保护模式&#xff0c;一种是打开文件保护&#xff0c;也就是设置打开密码&#xff0c;只有输入密码才能打开文件&#xff1b;另一种是限制保护&#xff0c;即限制密码&#xff0c;可以根据需要设置PDF文件是否可以进行编辑、复制、打印等操作。 如果不需要…

第二篇:Haploview做单倍型教程2--分析教程

大家好&#xff0c;我是邓飞&#xff0c;这里介绍一下如何使用Haploview进行单倍型的分析。 计划分为三篇文章&#xff1a; 第一篇&#xff1a;Haploview做单倍型教程1–软件安装第二篇&#xff1a;Haploview做单倍型教程2–分析教程第三篇&#xff1a;Haploview做单倍型教程…

kaggle竞赛 | 计算机视觉 | Doodle Recognition Challenge

目录赛题链接赛题背景数据集探索合并多个类别CSV数据集数据建模 (pytorch)赛题链接 https://www.kaggle.com/competitions/quickdraw-doodle-recognition/overview/evaluation 数据集从上述链接中找 赛题背景 Quick&#xff0c;Draw&#xff01;作为实验性游戏发布&#xff…

python元组

python元组 文章目录python元组一、实验目的二、实验原理三、实验环境四、实验内容五、实验步骤1.创建元组2.访问元组3.修改元组4.删除元组5.索引及截取6.元组运算符7.内置函数总结一、实验目的 掌握元组的用法 二、实验原理 Python 的元组与列表类似&#xff0c;不同之处在…

2. MySQL之mysql-connector-python的安装使用

MySQL 是最流行的关系型数据库管理系统&#xff0c;关于数据库以及MySQL相关知识&#xff0c;此处不再赘述。本篇介绍使用 mysql-connector-python 来连接使用 MySQL。 1. 安装mysql-connector-python 执行以下代码&#xff0c;没有报错&#xff0c;证明安装成功。 import my…

旗舰版:Stimulsoft Ultimate 2023.1.5 Crack

Stimulsoft Ultimate 是一套用于创建报告和仪表板的通用工具。该产品包括一整套适用于 WinForms、ASP.NET、.NET Core、JavaScript、WPF、PHP、Java 和其他环境的工具。 无需比较产品功能。Stimulsoft Ultimate 包括一切&#xff01; 报表设计器的一切 我们提供易于使用且功能齐…

Android深入系统完全讲解(41)

我们要学习的是整体逻辑&#xff0c;我们 C 找 Java 的依据是类和对象&#xff0c;参数中 JNIEnv *env, jobject obj 。 env 代表当前环境上下文&#xff0c;这个当我们多个线程调用的时候&#xff0c;需要 AttachCurrentThread 进行设定&#xff0c;让 env 关联到当前线程&…

Linux常见命令 24 - RPM命名管理-包命名与依赖性

目录 1. RPM包命名规则 2. RPM包依赖性 1. RPM包命名规则 如包全名&#xff1a;httpd-2.2.15-15.e16.centos.1.i686.rpm httpd&#xff1a;软件包名2.2.15&#xff1a;软件版本15&#xff1a;软件发布的次数el6.centos&#xff1a;适合的Linux平台&#xff1a;CentOS 6.xi6…

springboot和nacos整合mybatis-plus实现多数据源管理

文章目录1.依赖2.配置文件3.redis测试3.1redis配置文件3.2controller3.3测试4.mysql测试4.1数据库表和结构4.2实体类和枚举4.3DogMapper.xml4.4DogMapper4.5service和serviceImpl4.6controller4.7测试写了一个小demo&#xff0c;通过mybatis-plus实现多数据源管理使用了mysql和…

【笔记】A simple yet effective baseline for 3d human pose estimation

【论文】https://arxiv.org/abs/1705.03098v2 【pytorch】(本文代码参考)weigq/3d_pose_baseline_pytorch: A simple baseline for 3d human pose estimation in PyTorch. (github.com) 【tensorflow】https://github.com/una-dinosauria/3d-pose-baseline 基本上算作是2d人体…

Python压缩JS文件,PythonWeb程序员必看系列,重点是 slimit

Python 压缩文件系列文章&#xff0c;我们已经完成了 2 篇&#xff0c;具体如下&#xff1a; Python Flask 实现 HTML 文件压缩&#xff0c;9 级压缩 Python 压缩 css 文件&#xff0c;第三方模块推荐 压缩JS学习目录&#x1f6a9; jsmin 库&#x1f3a8; 库的安装&#x1f3a8…

HackTheBox Stocker API滥用,CVE-2020-24815获取用户shell,目录遍历提权

靶机地址&#xff1a; https://app.hackthebox.com/machines/Stocker枚举 使用nmap枚举靶机 nmap -sC -sV 10.10.11.196机子开放了22&#xff0c;80端口&#xff0c;我们本地解析一下这个域名 echo "10.10.11.196 stocker.htb" >> /etc/hosts 去浏览器访问…

操作系统真相还原_第5章第4节:特权级

文章目录特权级TSS简介CPL和DPL入门处理器提供的从低特权级到高特权级的方法门、调用门和RPL序特权级 保护模式下特权级按照权力大小分为0、1、2、3级 0特权级是操作系统内核所在的的特权级 TSS简介 TSS&#xff0c;即Task State Segment&#xff0c;意为任务状态段&#x…

Modbus协议完整版

第一部分&#xff1a;Modbus协议1 引言1.1 范围MODBUS是OSI模型第7层上的应用层报文传输协议&#xff0c;它在连接至不同类型总线或网络的设备之间提供客户机/服务器通信。自从1979年出现工业串行链路的事实标准以来&#xff0c;MODBUS使成千上万的自动化设备能够通信。目前&am…

【图卷积网络】03-空域卷积介绍

注&#xff1a;本文为3.1-3.2 空域卷积视频笔记&#xff0c;仅供个人学习使用 1、谱域图卷积 1.1 回顾 上篇博客【图卷积神经网络】02-谱域图卷积介绍讲到了三个经典的谱域图卷积&#xff1a; SCNN用可学习的对角矩阵来代替谱域的卷积核。 ChebNet采用Chebyshev多项式代替谱…

TIA博途中计算多个数据的算术平均值的具体方法示例

TIA博途中计算多个数据的算术平均值的具体方法示例 我们这里采用官方提供的Floating Average功能块来实现多个数据的算术平均值的计算。 此功能块计算最新输入的100个数值的均值(浮动平均值)。采集的数据队列达到100个之后,队列每入栈一个新数值,将去掉一个队列里最早进来的…