JavaWeb-Filter过滤器

news2024/11/24 19:06:39

目录

Filter过滤器

1. Filter的生命周期

2.Filter的配置

3.拦截路径

4.拦截具体的使用

 5.拦截方式配置(资源被访问方式)

6.FilterChain拦截链


Filter过滤器

      filter是过滤器,相比于Servlet的发送请求,filter是用于拦截请求。比如在登陆系统中,正常登陆的用户可以访问服务器的相关资源,而如果登陆信息错误,则拦截想要访问资源的请求。以下将具体介绍filter

1. Filter的生命周期

Filter的生命周期分为三部分,分别是init()初始化;doFilter()执行拦截;destroy()销毁;

具体如下代码

package com.company.Filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
//注解配置实现所有请求访问都进行拦截
@WebFilter("/*")
public class filterDemo1 implements Filter {
//    初始化
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("加载的时候自动执行,并且只执行一次");
    }
//    执行拦截
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("实现拦截的时候执行函数,可以多次执行");
    }
//    销毁
    @Override
    public void destroy() {
        System.out.println("在服务器关闭的时候,执行销毁函数");
    }
}

2.Filter的配置

Filter的配置分为两种,一种是xml配置,一种是通过注解类配置

  • 通过xml配置(打开web.xml):
    <filter>
<!--        随便创建想要的名称-->
        <filter-name>filterDemo1</filter-name>
<!--        filter对应的具体类-->
        <filter-class>com.company.Filter.filterDemo1</filter-class>
    </filter>
<!--    创建filter对应的映射-->
    <filter-mapping>
<!--        filter对应的名称-->
        <filter-name>filterDemo1</filter-name>
<!--        拦截路径,/*表示所有访问都会进行拦截-->
        <url-pattern>/*</url-pattern>
    </filter-mapping>
  • 通过注解类进行配置:

@WebFilter(value=url-pattern)

如果只需要写拦截规路径可以省略掉value = ;

直接输入@WebFilter("/*")实现对数据所有访问时候进行拦截


3.拦截路径

刚才介绍了/*是所有请求的拦截,但是对于具体访问的请求的拦截还无法做到,下面介绍其他拦截路径

  1. 具体路径访问的拦截:/index.jsp (当访问index.jsp文件时候实现拦截)
  2. 某一个目录的访问的拦截:/user (当访问user目录以下的所有文件时候进行拦截)
  3. 后缀名访问的拦截:*.jsp (实现对所有文件以.jsp后缀结尾访问的拦截)
  4. 拦截所有相关路径:/*     (访问所有服务器的资源时候都实现拦截)

4.拦截具体的使用

1.创建类实现Filter接口(注意Filter接口是包javax.servlet中的)

2.覆写生命周期函数

3.通过doFilter函数实现拦截。当通过后实现放行

案例代码:

拦截类

package com.company.Filter;

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

//通过注解类实现拦截路径
@WebFilter("/*")
//实现接口
public class filterDemo2 implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("过滤器已被加载");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("发现请求,实施拦截");
       进行验证,如果通过则实现放行
//        System.out.println("验证成功,放行");
//        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {
        System.out.println("服务器关闭时候执行销毁函数");
    }
}

模拟资源类

package com.company;

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

@WebServlet("/FilterDemo3")
public class FilterDemo3 extends HttpServlet {
    
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("访问到资源啦");
    }
//    方法统一
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }
}

当通过url访问资源类时候 可以看到请求被拦截了,无法执行资源类中输出"访问资源类啦"

再加上验证功能后如果允许通过则需要放行,执行FilterChain filterChain中filterChain对象的doFilter(servletRequest对象, servletResponse对象)即代码中的

//        拦截结束后如果通过则实现放行
        System.out.println("验证成功,放行");
        filterChain.doFilter(servletRequest, servletResponse);

 此时再通过url访问后,查看控制台的信息可以看到:


 5.拦截方式配置(资源被访问方式)

当然除了路径访问可以拦截以外,还可以设置拦截的方式,有些请求可以直接输入url直接访问类。有些通过一些网页实现跳转的方式获取类的资源。还有就是通过请求转发的形式获取类。所以基于如此可以对这些方法做一些限制。

拦截方法描述
REQUEST(请求拦截)拦截直接通过 URL 访问的请求。
FOWARD(转发拦截)拦截通过请求转发方式获取资源的请求。
INCLUDE(包含拦截)拦截通过网页跳转方式获取资源的请求。
ERROR(错误拦截)拦截发生错误或异常情况的请求。
ASYNC(异步拦截)拦截异步请求,即延迟加载的请求,可以防止对响应进行预先缓存和使用。

默认情况下是通过REQUEST实现拦截

具体使用还需要看开始时候使用的配置

  • 通过xml配置
   <filter>
        <filter-name>filterDemo1</filter-name>
        <filter-class>com.company.Filter.filterDemo1</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>filterDemo1</filter-name>
        <url-pattern>/*</url-pattern>
<!--        配置请求拦截方法-->
        <dispatcher>REQUEST</dispatcher>
    </filter-mapping>
  • 通过注解类配置


6.FilterChain拦截链

拦截链,顾名思义就是由多个过滤器组成,就像是一条路设置了多个收费站一样。只有满足所有的拦截规则后才能通过。

设置多个拦截器(其中一个的代码)

package com.company.Filter;

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

@WebFilter("/*")
public class filterDemo3 implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("拦截器1进行拦截");
        System.out.println("拦截器1放行");
//        拦截器放行
        filterChain.doFilter(servletRequest, servletResponse);
    }
    @Override
    public void destroy() {

    }
}

通过url访问时候结果如下

 拦截器的顺序

一.注解配置

是通过拦截器名字的排序比如01、02、03,先比较第一个数字大小,如果相同就比较第二个数字大小以此类推

二.xml配置

只需要配置xml时候由上往下即可


 

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

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

相关文章

电脑打开对话框中没有桌面这个选项解决办法

问题描述&#xff1a; 左侧栏中的桌面图标不显示 解决方法&#xff1a; 左侧的空白处右键-显示所有的文件夹 这时所有的文件夹都显示了&#xff01;

我给 PostgreSQL 官方 JDBC 驱动修复了一个高并发性能问题

这是我在 2022 年给 PostgreSQL 官方 JDBC 驱动 修复的一个高并发性能问题。 该问题影响的版本范围是 pgjdbc&#xff1a; 42.3.242.3.3 Issue: Concurrent performance issue in 42.3.2 caused by #2291 https://github.com/pgjdbc/pgjdbc/issues/2450 PR: Use non-synchro…

[Mongodb 5.0]聚合操作

本文对应Aggregation Operations — MongoDB Manual 正文 此章节主要介绍了Aggregation Pipeline&#xff0c;其实就是将若干个聚合操作放在管道中进行执行&#xff0c;每一个聚合操作的结果作为下一个聚合操作的输入&#xff0c;每个聚合指令被称为一个stage。 在正式开始学…

Vue使用jspdf和html2canvas组件库结合导出PDF文件

效果图&#xff1a; 1、安装依赖&#xff1a; npm install html2canvas --save npm install jspdf --save 或 yarn add html2canvas --save yarn add jspdf --save 2、封装全局调用方法&#xff1a;this.$exportPDF(#id,文件名) 新建js文件&#xff1a;/utils/html2Pdf.js&am…

Nginx 服务优化与防盗链

Nginx隐藏版本号、服务名 1. 改配置文件 HTTP模块中添加命令&#xff1a;server_tokens off&#xff1b; 关闭防火墙、安全机制 将配置文件备份一份&#xff0c;再进行配置 2. 改源码包 /opt/nginx-1.22.0/src/core/nginx.h #define NGINX_VERSION "1.1.1" #修改…

SSH公网远程直连Docker容器

文章目录 1. 下载docker镜像2. 安装ssh服务3. 本地局域网测试4. 安装cpolar5. 配置公网访问地址6. SSH公网远程连接测试7.固定连接公网地址8. SSH固定地址连接测试 在某些特殊需求下,我们想ssh直接远程连接docker 容器,下面我们介绍结合cpolar工具实现ssh远程直接连接docker容器…

【BASH】回顾与知识点梳理(二十七)

【BASH】回顾与知识点梳理 二十七 二十七. 磁盘配额(Quota)27.1 磁盘配额 (Quota) 的应用与实作什么是 QuotaQuota 的一般用途Quota 的使用限制Quota 的规范设定项目 27.2 一个 XFS 文件系统的 Quota 实作范例实作 Quota 流程&#xff1a;设定账号实作 Quota 流程-1&#xff1a…

使用 PostgreSQL 创建全文搜索引擎2:Postgres 与 Elasticsearch

使用 PostgreSQL 作为全文搜索引擎很诱人&#xff0c;因为它需要的基础设施较少。但它的搜索相关功能集是否足以与基于 Lucene 的替代方案竞争&#xff1f; 在第 1 部分中&#xff0c;我们深入研究了 PostgreSQL 全文搜索的功能&#xff0c;并探讨了如何实现相关性提升(releva…

如何选择最佳的文件传输协议?(FTP、TFTP、Raysync)

在数字化时代&#xff0c;通过互联网传输文件是一项常见的任务。因此&#xff0c;选择适合您企业需求的文件传输协议非常重要。 文件传输协议是发送方和接收方之间的一套规则和信息。它的作用就像网络两端都能理解的一种语言&#xff0c;使得数据可以正确输出并带有正确的文件…

SRM订单管理:优化供应商关系

一、概述SRM订单管理的概念&#xff1a; SRM订单管理是指在供应商关系管理过程中&#xff0c;有效管理和控制订单的创建、处理和交付。它涉及与供应商之间的沟通、合作和协调&#xff0c;旨在实现订单的准确性、可靠性和及时性。 二、SRM订单管理的流程&#xff1a; 1. 订单创…

问道管理:缩量小幅上涨说明什么?

股市里面&#xff0c;股票价格上涨或跌落都是常见现象。可是关于那些在商场上寻求收益的出资者来说&#xff0c;他们需要对每一个股市中的价格动摇有深化的了解&#xff0c;以便做出更正确的出资决策。最近&#xff0c;出资者们发现商场缩量小幅上涨的现象时有发生&#xff0c;…

SpringBoot复习:(51)默认情况下DataSource是怎么创建出来的,是什么类型的?

DataSource是通过DataSourceAutoConfiguration创建的&#xff0c;这个类代码如下&#xff1a; 可以看到DataSourceAutoConfiguration有个静态内部类PooledDataSourceConfiguration,在这个类上有个Import注解&#xff0c;导入了DataSourceConfiguration.Hikari这个类&#xff0…

8.15号经典模型复习笔记

文章目录 Deep Residual Learning for Image Recognition(CVPR2016)方法 Densely Connected Convolutional Networks&#xff08;CVPR2017&#xff09;方法 EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks&#xff08;ICML2019&#xff09;方法 Re…

科创板四周年,6家半导体厂商被评为最具价值上市公司

7月21日&#xff0c;由聚焦科创板的权威媒体《科创板日报》及财联社联合发起的“科创板开市四周年评选”榜单正式发布&#xff0c;其包括“2023最具价值科创板上市公司”、“2023最具创新力科创板上市公司”等子榜单。 其中&#xff0c;“2023最具价值科创板上市公司”子榜单评…

九州未来参与编制的开源领域3项团体标准获批发布

日前&#xff0c;中电标2023年第21号团体标准公告正式发布&#xff0c;其中由九州未来参与编制的3项开源领域团体标准正式获批发布&#xff0c;于2023年8月1日正式实施。 具体内容如下&#xff1a; 《T/CESA 1269-2023 信息技术 开源 术语与综述》&#xff0c;本文件界定了信息…

point line

2 * (2 - 1) / 2 1 3 * (3 - 1) / 2 3 4 * (4 - 1) / 2 6 5 * (5 - 1) / 2 10 ...... n * (n - 1) / 2

【实用插件】ArcGIS for AutoCAD插件分享下载

ArcGIS包含一系列功能&#xff0c;其中ArcGIS for AutoCAD一个免费的可下载的AutoCAD插件&#xff0c;它可简化将CAD和GIS数据整合在一起的过程提供互操作性。 ArcGIS for AutoCAD互操作性平台将连接AutoCAD和 ArcGIS&#xff0c;以增强使用地理环境设计CAD工程图时的用户体验…

vue3 + ts defineProps 设置默认值 + 子父之间的通信

首先要引入 import { withDefaults, defineProps, defineEmits } from vue1、接受父组件传递的参数与默认值 // 接受父组件传递参数 withDefaults(defineProps<{name: String;}>(),{name: 小怪兽,} ) 2、暴露子组件数据与方法 (如没有暴露&#xff0c;父组件不能使用子…

【C快学-C语言程序设计(基础篇)】从VSCode中使用C编写我的第一个Hello world

简介&#xff1a;本专栏是一个C语言基础入门知识学习的一个专栏 面向&#xff1a;广大C友 工具&#xff1a;VSCODE 博主&#xff1a;一个友好且宠粉的博主&#xff0c;送书活动小专栏&#xff0c;不定期抽奖送图书给粉丝 社区&#xff1a;&#x1f988;山鱼社区 1.如何配置C语言…

油电同价、标配8155,奇瑞猛攻10-15万中型SUV市场

8月8日&#xff0c;奇瑞瑞虎8冠军家族在北京国家奥林匹克体育中心正式上市&#xff0c;推出了瑞虎8 PRO冠军版、瑞虎8新能源冠军版两款新车&#xff0c;燃油混动双线同步发力。 其中&#xff0c;瑞虎8 PRO冠军版共推7款车型&#xff0c;官方指导价12.69万元-16.39万元&#xf…