JavaWeb-Filter过滤器

目录

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 {
//    初始化@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("加载的时候自动执行,并且只执行一次");}
//    执行拦截@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("实现拦截的时候执行函数,可以多次执行");}
//    销毁@Overridepublic 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 {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("过滤器已被加载");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("发现请求,实施拦截");进行验证,如果通过则实现放行
//        System.out.println("验证成功,放行");
//        filterChain.doFilter(servletRequest, servletResponse);}@Overridepublic 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 {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("访问到资源啦");}
//    方法统一@Overrideprotected 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 {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("拦截器1进行拦截");System.out.println("拦截器1放行");
//        拦截器放行filterChain.doFilter(servletRequest, servletResponse);}@Overridepublic void destroy() {}
}

通过url访问时候结果如下

 拦截器的顺序

一.注解配置

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

二.xml配置

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


 

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

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

相关文章

2023-08-14 linux 串口终端输入长命令不换行,覆盖前面内容,stty命令设置串口终端行列数

一、linux 串口终端输入长命令不换行&#xff0c;覆盖前面内容&#xff0c;现象如下图&#xff1a; 二、解决方法&#xff1a;用stty 命令设置行列数 stty columns 200 stty rows 10三、参考文章 https://www.cnblogs.com/goloving/p/15170537.html 常用Linux串口设备操作命…

【Servlet】(Servlet API HttpServlet 处理请求 HttpServletRequest 打印请求信息 前端给后端传参)

文章目录 Servlet APIHttpServlet处理请求 HttpServletRequest打印请求信息前端给后端传参 Servlet API Servlet中常用的API HttpServlet 实际开发的时候主要重写 doXXX 方法, 很少会重写 init / destory / service destory 服务器终止的时候会调用. //下面的注解把当前类和…

gin的占位符:和通配符*

1、用法 在 Gin 路由中&#xff0c;可以使用一个通配符&#xff08;*&#xff09;或一个占位符&#xff08;:&#xff09;来捕获 URL 的一部分。 r.GET("/royal/:id", func(c *gin.Context) {id : c.Param("id")//fmt.Println("into :id")c.Str…

HBase API

我们之后的实际开发中不可能在服务器那边直接使用shell命令一直敲的&#xff0c;一般都是通过API进行操作的。 环境准备 新建Maven项目&#xff0c;导入Maven依赖 <dependencies><dependency><groupId>org.apache.hbase</groupId><artifactId>…

命令执行漏洞

1、命令执行漏洞 1.1、简介 Django是用Python开发的一个免费开源的Web结构&#xff0c;几乎包括了Web使用方方面面&#xff0c;能够用于快速建立高性能、文雅的网站&#xff0c;Diango提供了许多网站后台开发常常用到的模块&#xff0c;使开发者可以专注于业务部分。 1.2、漏…

【删除vlan的方法】

提示错误 [SW1]undo vlan 10 Error: The VLAN has a L3 interface. Please delete it first. 解决办法 undo interface Vlanif10 #删除vlan 10下的接口 [SW1-GigabitEthernet0/0/1]dis this #删除下列的IP

接口自动化必备技能——jmeter提取token方式以及设置成全局变量(跨线程组传token值)方式

前言 今天Darren洋教大家如何使用jmeter中的插件来进行token值的提取与调用&#xff0c;今天Darren洋介绍两种jmeter提取token值的方式&#xff0c;一种是在当前线程组中直接提取token值&#xff0c;一种是跨线程组的方式进行token值的提取并调用给不同线程组里的HTTP接口使用。…

如何读取文件夹内的诸多文件,并选择性的保留部分文件

目录 问题描述: 问题解决: 问题描述: 当前有一个二级文件夹,第一层是文件夹名称是“Papers(LNAI14302-14304)",第二级文件夹目录名称如下图蓝色部分所示。第三层为存放的文件,如下下图所示,每一个文件中,均存放三个文件,分别为copyright.pdf, submission.pdf, s…

重磅发布!曙光存储“3+N”,绿色存力新选择

8月9-10日&#xff0c;2023年数据中心市场年会在京举办。会上&#xff0c;中科曙光存储产品事业部总监石静发表《绿色存力 打通绿色数据中心最后一站》主题演讲。“在今天&#xff0c;数据中心正在成为‘高能耗’产业&#xff0c;绿色节能从可选项走向必选项。曙光存储跨越绿色…

开发测试框架一 - 创建springboot工程及基础操作

一、创建及运行方式 1. 从官网导入&#xff1a; 注意&#xff1a;由于我的java版本是1.8&#xff1b;所以选中了spring2.7.14&#xff1b;如果你的java版本是9及以上&#xff0c;选中spring3相关的同时Java 版本也要对应起来 2. 创建第一个get请求 创建Controller package及…

mysql滑动窗口案例

获取学科最高分 SELECT DISTINCT name,subject,MAX(score) OVER (PARTITION by subject) as 此学科最高分数 from scores;获取学科的报名人数 select DISTINCT subject,count(name) over (partition by subject) as 报名此学科的人数 from scores; 求学科总分 SELECT DISTI…

Spring Boot + Vue3前后端分离实战wiki知识库系统十二--用户管理单点登录开发一...

目标&#xff1a; 在上一次https://www.cnblogs.com/webor2006/p/17533745.html我们已经完成了文档管理的功能模块开发&#xff0c;接下来则开启新模块的学习---用户登录&#xff0c;这块还是有不少知识点值得学习的&#xff0c;先来看一下整体的效果&#xff0c;关于效果官网有…

YOLOv8目标检测算法

YOLOv8目标检测算法相较于前几代YOLO系列算法具有如下的几点优势&#xff1a; 更友好的安装/运行方式速度更快、准确率更高新的backbone&#xff0c;将YOLOv5中的C3更换为C2FYOLO系列第一次尝试使用anchor-free新的损失函数 YOLOv8简介 YOLOv8 是 Ultralytics 公司继 YOLOv5…

FiboSearch Pro – Ajax Search for WooCommerce 商城AJAX实时搜索插件

FiboSearch Pro是最受欢迎的WooCommerce 产品搜索插件。它为您的用户提供精心设计的高级 AJAX 搜索栏&#xff0c;并提供实时搜索建议。默认情况下&#xff0c;WooCommerce 提供非常简单的搜索解决方案&#xff0c;没有实时产品搜索&#xff0c;甚至没有 SKU 搜索。FiboSearch&…

uniapp开发微信小程序底部地区选择弹框

个人项目地址&#xff1a; SubTopH前端开发个人站 &#xff08;自己开发的前端功能和UI组件&#xff0c;一些有趣的小功能&#xff0c;感兴趣的伙伴可以访问&#xff0c;欢迎提出更好的想法&#xff0c;私信沟通&#xff0c;网站属于静态页面&#xff09; SubTopH前端开发个人站…

React Native 图片组件基础知识

在 React Native 中使用图片其实跟 HTML 中使用图片一样简单&#xff0c;在 React Native 中我们使用Image组件来呈现图片的内容&#xff0c;其中主要的属性有&#xff1a;source。这个属性主要是设置图片的内容&#xff0c;它可以是网络图像地址、静态资源、临时本地图像以及本…

Android侧滑栏(一)可缩放可一起移动的侧滑栏

在实际的各类App开发中&#xff0c;经常会需要做一个左侧的侧滑栏&#xff0c;类似于QQ这种。 今天这篇文章总结下自己在开发中遇到的这类可以跟随移动且可以缩放的侧滑栏。 一、实现原理 使用 HorizontalScrollView 实现一个水平方向的可滑动的View&#xff0c;左布局为侧滑…

Camx--概述

该部分代码主要位于 vendor/qcom/proprietary/ 目录下&#xff1a; 其中 camx 代表了通用功能性接口的代码实现集合&#xff08;CamX&#xff09;&#xff0c;chi-cdk代表了可定制化需求的代码实现集合&#xff08;CHI&#xff09;&#xff0c;从图中可以看出Camx部分对上作为H…

Linux 性能分析之iostat命令详解

Linux 性能分析之iostat命令详解 iostat命令是IO性能分析的常用工具&#xff0c;其是input/output statistics的缩写。本文将着重于下面几个方面介绍iostat命令&#xff1a; iostat的安装iostat命令行选项说明iostat输出内容分析如何确定磁盘IO的瓶颈iostat实际案例 命令的安…

django boostrap html实现可拖拽的左右布局,鼠标拖动调整左右布局的大小或占比

一、实现的效果 最近需要在Django项目中,实现一个左右布局的html页面,页面框架使用的是boostrap。但这个布局不是简单的左右分栏布局,而是需要实现可以通过鼠标拖拽的方式动态调整左右两侧布局的大小和占比。效果大致如下: 一开始,页面分为左右两块布局: 鼠标放到中间的…