过滤器Filter【详解】

ops/2024/10/9 12:51:10/

过滤器Filter


1、 现有问题

在以往的Servlet中,有冗余的代码,多个Servlet都有重复的代码

  • 比如编码格式设置

  • 登录信息认证

2、 概念

过滤器(Filter)是处于客户端与服务器目标资源之间的一道过滤技术。

过滤器

image-20230524220124509

image-20231121163149436

3、 过滤器作用

  • 执行顺序在Servlet之前,客户端发送请求时,会先经过Filter,再到达目标Servlet中;响应时,会根据执行流程再次反向执行Filter

  • 可以解决多个Servlet共性代码的冗余问题(例如:乱码处理、登录验证)

4、 编写过滤器

Servlet API中提供了一个Filter接口,开发人员编写一个Java类实现了这个接口即可,这个Java类称之为过滤器(Filter)

  • 编写Java类实现Filter接口

  • doFilter方法中编写拦截逻辑

  • 设置拦截路径@WebFilter("path"),path写法

    • /* 拦截所有请求路径

    • /a 拦截指定的/a请求

    • *.do 拦截指定的后缀请求

    • 也可以写对多个 {"/a","/b"}

5、 过滤器链和优先级

5.1 过滤器链

客户端对服务器请求之后,服务器调用Servlet之前会执行一组过滤器(多个过滤器),那么这组过滤器就称为一条过滤器链。

每个过滤器实现某个特定的功能,当第一个Filter的doFilter方法被调用时,Web服务器会创建一个代表Filter链的FilterChain对象传递给该方法。在doFilter方法中,开发人员如果调用了FilterChain对象的doFilter方法,则Web服务器会检查FilterChain对象中是否还有filter,如果有,则调用第2个filter,如果没有,则调用目标资源。

过滤器链

image-20230524220221983

5.2 过滤器优先级

在一个Web应用中,可以开发编写多个Filter,这些Filter组合起来称之为一个Filter链。 优先级:

  • 如果为注解的话,是按照类全名称的字符串顺序决定作用顺序

6、 过滤器应用1:全局编码

以前: 在每个servlet为了防止乱码,在进行操作之前,都先设置请求和响应的编码格式.

现在: 使用拦截器,对所有请求拦截器,设置编码,然后放行


@WebFilter("/*")
public class EncodingFilter implements Filter {
​@Overridepublic void init(FilterConfig filterConfig) throws ServletException { }
​@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {// 设置编码格式request.setCharacterEncoding("UTF-8");response.setContentType("text/html;charset=UTF-8");
​
​// 放行chain.doFilter(request,response);}
​@Overridepublic void destroy() { }
}

7、 过滤器应用2: 身份认证拦截器

以前: 在web项目中,在每个Servlet中都要对身份进行认证

现在: 使用拦截器,将身份过滤的代码前置到拦截器,对每个请求先身份认证

@WebFilter("/*")
// @WebFilter("/hw/*")
// @WebFilter("*.do")
public class LoginFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException { }
​/*** 对请求的身份进行认证* 请求中获得session,且session中有登录时存入的数据,说明登录成功,放行* 请求中获得session,但是session中没有数据,说明没有登录,重定向到登录页*/@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
​// 获取sessionHttpServletRequest req = (HttpServletRequest) request;HttpSession session = req.getSession( );
​String requestURI = req.getRequestURI( );
​/*** 因为是拦截所有 /** 所以要放行 静态资源以及第一次登录的请求*/if(requestURI.contains("login")) {// 放行chain.doFilter(request, response);} else {// 从session获得数据String username = (String) session.getAttribute("username");// 判断if (username != null){// 放行chain.doFilter(request, response);} else {HttpServletResponse resp = (HttpServletResponse) response;resp.sendRedirect("/index.jsp");}}
​}
​@Overridepublic void destroy() { }
}


http://www.ppmy.cn/ops/123189.html

相关文章

Databinding(kotlin)

简单使用(只作为view获取) build.gradle.kts配置 android {dataBinding {enable true}}activity注入 //setContentView(R.layout.activity_main) val binding: ActivityMainBinding DataBindingUtil.setContentView(this, R.layout.activity_main)x…

【预备理论知识——2】深度学习:线性代数概述

简单地说,机器学习就是做出预测。 线性代数 线性代数是数学的一个分支,主要研究向量空间、线性方程组、矩阵理论、线性变换、特征值和特征向量、内积空间等概念。它是现代数学的基础之一,并且在物理学、工程学、计算机科学、经济学等领域有着…

【HTTPS】深入解析 https

我的主页:2的n次方_ 1. 背景介绍 在使用 http 协议的时候是不安全的,可能会出现运营商劫持等安全问题,运营商通过劫持 http 流量,篡改返回的网页内容,例如广告业务,可能会通过 Referer 字段 来统计是…

b站-湖科大教书匠】4 网络层 - 计算机网络微课堂

【b站-湖科大教书匠】4 网络层 - 计算机网络微课堂_湖科大的计算机网络网课-CSDN博客

【小土堆】PyTorch深度学习学习笔记

1.PyTorch中的DataSet类 因为在up主这里讲了DataSet类的基本使用,那我就想去把DataSet具体学习一下在会过来看up住的内容。 在开发Pytorch项目的时候,项目代码会被分为数据处理模块、模型构建模块、训练模块。其中的数据处理模块的主要任务是构建数据集&…

wsl(2) -- ubuntu24.04配置

1. 常用脚本及别名配置 修改的文件内容参考另一篇文章常用bash脚本。 修改~/.bashrc,在文件末尾追加以下内容。 # Add by user export MYTOOLS$HOME/tools export MYBINS$HOME/bins # 系统中其他地方已经添加过了,暂不清楚是哪里添加的 #export PATH$…

Java后端基础练习|请求参数

请求参数,可以通过四种方式传递到后端 请求路径查询参数请求体请求头 controller代码 package com.urfread.breaknews.core.controller;import com.urfread.breaknews.core.common.model.ResultData; import lombok.Data; import org.springframework.web.bind.a…

通信工程学习:什么是RIP路由信息协议

RIP:路由信息协议 RIP(Routing Information Protocol)路由信息协议是一种基于距离矢量算法的内部网关协议(IGP),主要用于在自治系统(AS)内部进行路由信息的交换和传播。以下是关于RI…