过滤器Filter【详解】

news2024/11/27 9:56:53

过滤器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 {
​
    @Override
    public void init(FilterConfig filterConfig) throws ServletException { }
​
    @Override
    public 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);
    }
​
    @Override
    public void destroy() { }
}

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

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

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

@WebFilter("/*")
// @WebFilter("/hw/*")
// @WebFilter("*.do")
public class LoginFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException { }
​
    /**
     * 对请求的身份进行认证
     * 请求中获得session,且session中有登录时存入的数据,说明登录成功,放行
     * 请求中获得session,但是session中没有数据,说明没有登录,重定向到登录页
     */
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
​
        // 获取session
        HttpServletRequest 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");
            }
        }
​
    }
​
    @Override
    public void destroy() { }
}

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

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

相关文章

Python办公自动化教程(006):Word添加标题

2.3 word标题 介绍: 在 python-docx 中,您可以使用 add_heading() 方法为文档添加标题。此方法允许您指定标题的文本和级别(例如,一级标题、二级标题等)。标题级别的范围是从 0 到 9,其中 0 表示文档的主标…

深度解析:从浏览器输入链接到页面展现的奇幻历程

〇、前言 当我们在浏览器中输入一个网址,例如:example.com,按下回车键后,会发生什么呢? 主要会发生以下这些过程:域名解析、建立HTTP连接、发送HTTP请求、数据传输、渲染网页、断开HTTP连接。 一、域名解…

类型转换【C++提升】(隐式转换、显式转换、自定义转换、转换构造函数、转换运算符重载......你想知道的全都有)

更多精彩内容..... 🎉❤️播主の主页✨😘 Stark、-CSDN博客 本文所在专栏: C系列语法知识_Stark、的博客-CSDN博客 座右铭:梦想是一盏明灯,照亮我们前行的路,无论风雨多大,我们都要坚持不懈。 一…

【srm系统】供应商管理,招投标管理,电子采购系统,询价管理

前言: 随着互联网和数字技术的不断发展,企业采购管理逐渐走向数字化和智能化。数字化采购平台作为企业采购管理的新模式,能够提高采购效率、降低采购成本、优化供应商合作效率,已成为企业实现效益提升的关键手段。系统获取在文末…

[含文档+PPT+源码等]精品基于Python实现的美术馆网站的设计与实现

基于Python实现的美术馆网站,其设计与实现背景主要源于以下几个方面的需求和发展趋势: 一、文化艺术领域的发展需求 随着文化娱乐活动的日益丰富,美术馆作为展示艺术作品、传播文化的重要场所,其管理和服务模式的创新对于提升公…

LabVIEW提高开发效率技巧----使用动态事件

在LabVIEW开发过程中,用户交互行为可能是多样且不可预知的。为应对这些变化,使用动态事件是一种有效的策略。本文将从多个角度详细介绍动态事件的概念及其在LabVIEW开发中的应用技巧,并结合实际案例,说明如何通过动态事件提高程序…

【售后资料】软件售后服务方案(word原件)

软件售后服务方案的售后服务范围广泛,涵盖了多个方面,以确保客户在使用软件过程中得到全面、及时的支持。具体来说,这些服务范围通常包括以下几个核心内容: 技术支持服务维护与更新服务培训与教育服务定制化服务数据管理与服务客户…

如何获取网页内嵌入的视频?

如何获取网页内嵌入的视频? 有时插件无法识别的视频资源,可以通过手动使用浏览器的开发者工具来抓取。你可以按照以下步骤操作: 步骤: 打开网页并按 F12:在视频页面按下 F12 或右键点击网页并选择“检查”或“Inspe…

Spring Boot实现的大学生就业市场解决方案

1系统概述 1.1 研究背景 如今互联网高速发展,网络遍布全球,通过互联网发布的消息能快而方便的传播到世界每个角落,并且互联网上能传播的信息也很广,比如文字、图片、声音、视频等。从而,这种种好处使得互联网成了信息传…

【案例】距离限制模型透明

开发平台:Unity 2023 开发工具:Unity ShaderGraph   一、效果展示 二、路线图 三、案例分析 核心思路:计算算式:透明值 实际距离 / 最大距离 (实际距离 ≤ 最大距离)   3.1 说明 | 改变 Alpha 值 在 …

简易投影仪的制作

今天不做开发类的文章,来给大家整个活哈哈哈哈哈。由于前几天室友说看小屏幕的抖音太不舒服,比较累眼睛,所以我萌生出来一个制作投影仪的想法。于是查阅了资料最终完成以下的设计。 以下设计价格最高的是一部旧的可拆卸的智能手机 简易投影仪…

C++11新特性(基础)【2】

目录 1.范围for循环 2.智能指针 3.STL中一些变化 4.右值引用和移动语义 4.1 左值引用和右值引用 4.2 左值引用与右值引用比较 4.3 右值引用使用场景和意义 4.4 右值引用引用左值及其一些更深入的使用场景分析 4.5 完美转发 1.范围for循环 int main() {int array[10] { 1,2,3,4…

CSS | CSS中强大的margin负边距

css中的负边距(negative margin)是布局中的一个常用技巧,只要运用得合理常常会有意想不到的效果。很多特殊的css布局方法都依赖于负边距,所以掌握它的用法对于前端的同学来说,那是必须的。本文非常基础,老鸟可以略过。 一、负边距…

【宽搜】3. leetcode 515 在每个树行中找最大值

1 题目描述 题目链接:在每个树行中找最大值 2 题目解析 根据题目描述,是找出每一行中的最大值,这毋庸置疑是使用宽度优先遍历了。我在这篇文章中讲解了宽度优先遍历的模板,如果没有看的同学可以先去看一下。 这道题和模板的不…

基于微信小程序的调查问卷管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…

数据结构与算法(七)静态链表

目录 前言 一、静态链表的引入 二、线性表的静态链表存储结构 三、静态链表的插入操作 四、静态链表的删除操作 五、静态链表的优缺点总结 1、优点 2、缺点 3、小结 六、单链表小结——Tecent面试题 1、普通解法: 2、高级解法: 前言 静态链表…

基于CAN总线的TMS320F28335 Bootloader设计说明

1 设计目的 根据客户要求,开发一款基于CAN总线的TI公司TMS320F28335 DSP(数字信号处理器)bootloader,以方便应用程序的刷写。CAN设备采用周立功CAN卡(USBCAN-I、USBCAN-II、USBCAN-E-mini)。 2 专有信息 …

一篇文章吃透OA系统

一、OA系统是什么,都有什么功能? OA系统(Office Automation System)是办公自动化系统的简称,是一种利用计算机技术和网络通信技术,为企业和组织提供办公管理和协作支持的信息化系统。OA系统旨在提高办公效…

讯飞星火编排创建智能体学习(五):变量和文本拼接

引言 在讯飞星火编排创建智能体学习(四):网页读取-CSDN博客中,我介绍了如何用网页读取功能从网上搜索车次信息。其中,我使用用大模型节点从文本中提取车次并合成了所需要的URL,今天介绍一下如何用变量和文…

win7怎么禁用驱动强制数字签名?win7驱动程序强制数字签名禁用方法

在Windows 7 64位操作系统中,安装驱动程序时可能会遇到“数字签名”的问题,这是微软为了确保驱动程序的安全性和可靠性而引入的一项安全机制。本文将深入探讨这个问题,并提供有效的解决方案。 理解数字签名的概念是至关重要的。数字签名是一…