Springboot项目快速实现过滤器功能

阅读建议


嗨,伙计!刷到这篇文章咱们就是有缘人,在阅读这篇文章前我有一些建议:

  1. 本篇文章大概5000多字,预计阅读时间长需要5分钟。
  2. 本篇文章的实战性、理论性较强,是一篇质量分数较高的技术干货文章,建议收藏起来,方便时常学习与回顾,温故而知新。
  3. 创作不易,免费的点赞、关注,请走上一走,算是对博主一些鼓励,让我更有动力输出更多的干货内容。
     

前言

很多时候,当你以为掌握了事实真相的时间,如果你能再深入一点,你可能会发现另外一些真相。比如面向切面编程的最佳编程实践是AOP,AOP的主要作用就是可以定义切入点,并在切入点纵向织入一些额外的统一操作,避免与业务代码过度耦合。熟悉java web项目的都知道,另外还有过滤器(filter)、拦截器(interceptor)也有类似AOP的功能特性,那么问题来了:为什么一般说面向切面编程就是指AOP,而不是过滤器和拦截器?过滤器和拦截器在Spring boot中怎么实现?这三者之间有什么区别?Springboot项目快速实现Aop功能中分享了AOP的相关实现,下面将再用两到三篇文章,分别和大家分享一下过滤器、拦截器的实现,以及AOP、过滤器、拦截器之间的横向对比,以便在业务开发中,能够快速、正确选对具体实现方法。

环境配置

jdk版本:1.8

开发工具:Intellij iDEA 2020.1

springboot:2.3.9.RELEASE

Filter简介

Filter, 中文意思是过滤器,Filter的全限定类名是javax.servlet.Filter,可以看出这是与servelt相关的一个接口;SpringMVC核心是DispatcherServlet,而DispatcherServlet又继承了Servlet,进而可以推测出Filter与SpringMVC也是关联关系。

事实上这样的推测也是正确的,在SpringMVC项目中,filter在浏览器与服务器之间起过滤的作用,可以截取客户端和服务端之间的请求和响应信息,并根据这些请求-响应信息作一些其他的操作,但是要注意,filter并不能改变请求-响应信息;

核心类

Filter

Filter接口的全限定类名是javax.servlet.Filter,该接口有三个方法,分别是

1、init(...):用于初始化Filter;

2、doFilter(...):过滤请求和拦截响应信息的具体实现在这个方法里;

3、destroy(...):Filter对象被销毁时触发,主要用于做一些收尾工作,如资源的释放等;

FilterConfig

FilterConfig接口的全限定类名是javax.servlet.FilterConfig,该接口主要有四个方法,分别是:

1、getFilterName() 获取Filter的名字;

2、getServletContext() 获取ServletContext对象(即application);

3、getInitParameter() 获取Filter的初始化参数;

4、getInitParameterNames() 获取所有初始化参数的名字;

FilterChain

FilterChainr接口的全限定类名是javax.servlet.FilterChain,该接口只有一个方法,是doFilter()方法,用于调用Filter链上的下一个过滤器,如果当前过滤器为最后一个或只有一个过滤器,则该过滤器则将请求发送到目标资源。

MyFilter2是自己实现的过滤器,实现了Filter接口;Filter接口依赖FilterChain接口和FilterConfig接口,其中FilterChain接口的实现类是org.apache.catalina.core.ApplicationFilterChain,FilterConfig接口的实现类是org.apache.catalina.core.ApplicationFilterConfig;

工作原理

1、项目启动的时候,先执行Filter的构造方法,完成相关Filter对象的注册;

2、紧接着,Filter对象的init()方法被调用,开始对Filter做一些初始化操作;

3、项目启动完成后,客户端每次向服务端发起请求时,如果请求地址与过滤器定义的地址匹配,则会执行Filter的doFilter();如果匹配上多个过滤器,则会形成一个链路,依次调用各个过滤器对象的doFilter();服务端作出响应后,也会再次执行到各个过滤器对象的doFilter();请求和响应时,过滤器链的执行顺序是先进后出;

4、服务器停止时调用Filter的destroy()方法,用来释放资源。

实现方式

Springboot项目中一般有两种方式:

1、@WebFilter注解,即javax.servlet.annotation.WebFilter;

2、FilterRegistrationBean,即org.springframework.boot.web.servlet.FilterRegistrationBean;

两种方式,都需要在启动类上增加注解@ServletComponentScan,用于开启servlet相关bean的扫描,其中包含有过滤器(Filter);


@SpringBootApplication
@ServletComponentScan
public class FanfuApplication {
    public static void main(String[] args) {
        SpringApplication.run(FanfuApplication.class, args);
    }
}

代码实现

1、WebFilter注解里,定义一下过滤器的名字,以及要对哪些请求进行过滤,“/*”表示对所有的请求都过滤,在实际业务中,可具体对待;如果在初始化的时候,需要携带一些初始化的参数,可以在initParams属性上,使用@WebInitParam注解来定义初始化参数名称和具体的值,这些参数可以在filter对象初始化的时候获取到;MyFIlter1和MyFIlter2使用的注解方式定义的过滤器;


@Slf4j
@WebFilter(filterName = "myFilter1", urlPatterns = "/*", initParams = {@WebInitParam(name = "creator", value = "fanfu")})
public class MyFilter1 implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        log.info("//myFilter1初始化开始");
        String creator = filterConfig.getInitParameter("creator");
        log.info("//初始化参数creator:{}",creator);
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        log.info("//myFilter1开始执行");
        chain.doFilter(request, response);
        log.info("//myFilter1结束执行");
    }

    @Override
    public void destroy() {
        log.info("//myfilter1被销毁");
    }
}

@Slf4j
@WebFilter(filterName = "myFilter2", urlPatterns = "/*")
public class MyFilter2 implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        log.info("//myFilter2初始化开始");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        log.info("//myFilter2开始执行");
        chain.doFilter(request, response);
        log.info("//myFilter2结束执行");
    }

    @Override
    public void destroy() {
        log.info("//myFilter2被销毁");
    }
}

2、FilterRegistrationBean方式

在Springboot项目的配置类中,使用FilterRegistrationBean来包装自定义的过滤器,这种方式的最大好处就是可以自定义过滤器的执行顺序,数字越小,执行时的优先级就越高;MyFIlter3和MyFIlter4是使用FilterRegistrationBean方式定义的过滤器;


@Configuration
public class WebConfig {

    @Bean
    public FilterRegistrationBean filterRegistration1() {
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        filterRegistrationBean.setFilter(new MyFilter3());
        filterRegistrationBean.addUrlPatterns("/*");//定义过滤器对哪些请求路径进行过滤,/*表示对所有请求都过滤
        filterRegistrationBean.setOrder(2);//定义过滤器的执行优先级,数据越小优先级越高
        return filterRegistrationBean;
    }

    @Bean
    public FilterRegistrationBean filterRegistration2() {
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        filterRegistrationBean.setFilter(new MyFilter4());
        filterRegistrationBean.addUrlPatterns("/*");
        filterRegistrationBean.setOrder(1);
        return filterRegistrationBean;
    }
}

@Slf4j
public class MyFilter3 implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    log.info("//MyFilter3初始化开始");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        log.info("//MyFilter3开始执行");
        chain.doFilter(request,response);
        log.info("//MyFilter3结束执行");
    }

    @Override
    public void destroy() {
        log.info("//MyFilter3被销毁");
    }
}

@Slf4j
public class MyFilter4 implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        log.info("//MyFilter4初始化开始");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        log.info("//MyFilter4开始执行");
        chain.doFilter(request,response);
        log.info("//MyFilter4结束执行");
    }

    @Override
    public void destroy() {
        log.info("//MyFilter4被销毁");
    }
}

未定义myFilter3、myFilter4的执行优先级,即采取自然排序时的执行结果:在请求前myFilter3的执行时机早于myFilter4,响应后myFilter3的执行时机要晚于myFilter4;

定义myFilter4的优先级高于myFilter3时,执行结果:在请求前myFilter4的执行时机早于myFilter3,响应后的myFilter4的执行时机要晚于myFilter3;

总结

过滤器的实现是比较简单,通过梳理这个过程,我get到以下几个点:

1、过滤器是用于SpringMVC项目中,即与servlet相关的项目;

2、过滤器的执行时机是在请求前和响应后,有两种实现方式,即@WebFilter注解和FilterRegistrationBean;如果对过滤器的执行顺序没有限制要求,则可以使用第一种;如果对过滤器的执行顺序有明确限制,则可以使用第二种;

3、如果有多个过滤器对象时,会形成一个过滤器链,过滤器的执行顺序是先进后出;

4、过滤器可以过滤请求和拦截响应,但是不能改变请求值和响应值;

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
SpringBoot项目知识管理系统是一个为企业、团队和个人用户设计的信息管理与共享平台。它利用Spring Boot快速开发特性,结合了文档存储、分类标签、权限控制、知识检索、内容编辑以及协作交流等功能,旨在提供一个集中化的知识资料库,促进知识的积累、共享和再利用,提高团队效率和创新能力。 以下是该知识管理系统的主要功能: 1. **文档管理**:用户可以上传、下载、编辑和删除文档,支持多种文件格式。 2. **智能分类与标签系统**:为文档添加标签,实现多维度分类,方便检索和管理。 3. **细粒度访问控制**:设置不同的访问权限,确保敏感信息的安全。 4. **全文搜索与高级检索**:快速查找所需文档,支持关键词搜索、模糊匹配和过滤结果。 5. **在线协作工具**:集成在线编辑器和评论系统,支持多人实时协作和讨论。 6. **移动设备优先设计**:采用响应式布局,使平台在不同大小的屏幕上均有良好展现,尤其适应移动设备。 7. **数据安全与备份**:采取加密技术和定期备份机制,防止数据丢失和泄露。 8. **友好的用户操作界面**:界面直观易用,降低用户学习成本,并提供多语言支持。 9. **易于维护和扩展**:前后端分离架构和模块化设计,方便未来根据组织需求进行系统升级或功能拓展。 10. **自定义报表与分析**:生成知识使用情况报告,帮助管理者了解资源的利用情况并做出决策。 通过这些功能,基于Spring Boot的知识管理系统不仅提高了企业的知识资产管理效率,还促进了员工之间的知识共享和协同工作。系统的架构设计注重性能、可用性和可维护性,以支持高并发的用户访问和动态的数据更新。其模块化的设计也便于未来根据知识管理领域的发展增加新功能或升级现有功能,确保软件的长期适用性和技术前瞻性。
资源介绍 本资源为一份完整的基于Spring Boot开发的新闻推荐系统的毕业设计项目,附带详细的毕业论文和源代码。此项目旨在通过运用现代软件开发技术,构建一个功能齐全、性能稳定的新闻推荐系统,为用户提供个性化的新闻阅读体验。 项目采用了Spring Boot框架进行快速开发,充分利用了Spring Boot的自动化配置和简化开发的特性,使得整个项目结构清晰、易于维护。同时,系统还集成了数据库、缓存、消息队列等关键技术,保障了数据的安全性、高效性和实时性。 在新闻推荐方面,项目采用了基于内容的推荐算法和协同过滤算法,通过对用户历史行为数据的挖掘和分析,为用户推荐感兴趣的新闻内容。此外,系统还提供了新闻发布、管理、分类、搜索等功能,满足了新闻平台的基本业务需求。 毕业论文对项目的开发背景、需求分析、系统设计、实现过程以及测试验证等方面进行了全面阐述,是理解项目整体架构和功能的重要参考。源代码则包含了项目的所有实现细节,包括控制器、服务层、数据访问层等各个模块的代码,方便读者进行学习和二次开发。 此项目不仅具有实际应用价值,还展示了Spring Boot框架在Web开发中的优势。对于学习Java Web开发、Spring Boot框架以及推荐算法的同学来说,这是一个难得的学习和实践机会。同时,项目具有良好的可定制性和扩展性,可以根据实际需求进行二次开发和功能定制。 总之,本资源是一份非常有价值的毕业设计项目,无论是对于学习还是对于实践,都具有重要的意义。
**项目说明** - 采用SpringBoot、MyBatis、Shiro框架,开发的一套权限系统,极低门槛,拿来即用。设计之初,就非常注重安全性,为企业系统保驾护航,让一切都变得如此简单。 - 提供了代码生成器,只需编写30%左右代码,其余的代码交给系统自动生成,可快速完成开发任务 - 后台系统支持MySQL、Oracle、SQL Server、PostgreSQL等主流数据库,客户端系统仅支持MySQL <br> **具有如下特点** - 灵活的权限控制,可控制到页面或按钮,满足绝大部分的权限需求 - 完善的部门管理及数据权限,通过注解实现数据权限的控制 - 完善的XSS防范及脚本过滤,彻底杜绝XSS攻击 - 支持分布式部署,session存储在redis中 - 友好的代码结构及注释,便于阅读及二次开发 - 引入quartz定时任务,可动态完成任务的添加、修改、删除、暂停、恢复及日志查看等功能 - 页面交互使用Vue2.x,极大的提高了开发效率 - 引入swagger文档支持,方便编写API接口文档 <br> **数据权限设计思想** - 管理员管理、角色管理、部门管理,可操作本部门及子部门数据 - 菜单管理、定时任务、参数管理、字典管理、系统日志,没有数据权限 - 业务功能,按照用户数据权限,查询、操作数据【没有本部门数据权限,也能查询本人数据】 <br> **项目结构** ``` renren-security ├─renren-common 公共模块 │ ├─renren-admin 管理后台 │ ├─db 数据库SQL脚本 │ │ │ ├─modules 模块 │ │ ├─job 定时任务 │ │ ├─oss 文件存储 │ │ └─sys 系统管理(核心) │ │ │ └─resources │ ├─mapper MyBatis文件 │ ├─statics 静态资源 │ ├─template 系统页面 │ │ ├─modules 模块页面 │ │ ├─index.html AdminLTE主题风格(默认主题) │ │ └─index1.html Layui主题风格 │ └─application.yml 全局配置文件 │ │ ├─renren-api API服务,此部分用于二次开发 │ ├─renren-generator 代码生成器 │ └─resources │ ├─mapper MyBatis文件 │ ├─template 代码生成器模板(可增加或修改相应模板) │ ├─application.yml 全局配置文件 │ └─generator.properties 代码生成器,配置文件 │ ├─client 客户端模块,业务前端部分 ``` <br> **技术选型:** - 核心框架:Spring Boot 2.0 - 安全框架:Apache Shiro 1.4 - 视图框架:Spring MVC 5.0 - 持久层框架:MyBatis 3.3 - 定时器:Quartz 2.3 - 数据库连接池:Druid 1.1 - 日志管理:SLF4J 1.7、Log4j - 页面交互:Vue2.x <br> **软件需求** - JDK1.8 - MySQL5.5+ - Maven3.0+ <br> **本地部署** - 通过git下载源码 - 创建数据库renren_security,数据库编码为UTF-8 - 执行db/mysql.sql文件,初始化数据【按需导入表结构及数据】 - 导入仓库、仓位、设备数据,请按照表结构导入。 - 修改renren-admin模块application-dev.yml文件,更新MySQ ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。
### 回答1: Spring Boot是一个使用Java开发的轻量级框架,用于快速创建微服务应用程序。它提供了许多方便的功能,其中之一是实现过滤器。 在Spring Boot中,您可以通过实现`javax.servlet.Filter`接口或继承`javax.servlet.Filter`类来实现过滤器。您可以使用@Component注解将其标记为组件,并在应用程序中使用它。 以下是一个简单的示例,该示例演示了如何实现过滤器并将其应用于请求: ``` import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import org.springframework.stereotype.Component; @Component public class MyFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("MyFilter is executing."); chain.doFilter(request, response); } } ``` 您可以通过实现`doFilter`方法并在其中编写过滤逻辑来实现自定义过滤器。您可以使用`FilterChain`对象将请求传递给下一个过滤器或最终的servlet。 最后,您需要注册过滤器,以便在应用程序中使用它。您可以通过在启动类上使用`@ServletComponentScan`注解来注册过滤器。 ``` import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet. ### 回答2: 使用Spring Boot实现过滤器可以通过编写一个类并使用特定注解实现。 首先,我们需要创建一个过滤器类。这个类可以继承`javax.servlet.Filter`接口,并实现其中的方法。例如,我们可以创建一个名为`MyFilter`的类来处理过滤逻辑。 ```java import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class MyFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { // 初始化方法 } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) servletRequest; HttpServletResponse response = (HttpServletResponse) servletResponse; // 在此处实现过滤逻辑 filterChain.doFilter(request, response); } @Override public void destroy() { // 销毁方法 } } ``` 然后,我们需要在Spring Boot应用的入口类上添加`@ServletComponentScan`注解,以扫描并注册我们的过滤器类。例如,如果入口类是`Application`,我们可以这样使用注解: ```java import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; @SpringBootApplication @ServletComponentScan // 添加此注解 public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` 最后,我们需要在过滤器类上添加`@WebFilter`注解,以指定过滤器的URL匹配规则。例如,我们可以在`MyFilter`类上添加注解: ```java import javax.servlet.annotation.WebFilter; @WebFilter(urlPatterns = "/api/*") // 添加此注解 public class MyFilter implements Filter { // ... } ``` 通过以上步骤,我们就成功地在Spring Boot应用中实现了一个过滤器。当访问以`/api/`开头的URL时,过滤器将会被触发,执行我们在`doFilter`方法中定义的过滤逻辑。 ### 回答3: Spring Boot是基于Spring框架的一个快速开发框架,它提供了很多方便的功能来简化Java应用程序的开发过程。其中之一就是实现过滤器。 在Spring Boot中,实现过滤器需要以下步骤: 1. 创建一个类并实现javax.servlet.Filter接口,该接口定义了过滤器的生命周期和函数。 2. 在该类上面添加注解@Component,将其声明为一个Spring组件,以便Spring Boot能够自动扫描并将其初始化为一个Bean。 3. 实现Filter接口的三个方法:init、doFilter和destroy。 - 在init方法中,可以执行过滤器的初始化操作,例如加载配置文件或者建立数据库连接等。 - 在doFilter方法中,可以编写过滤器的业务逻辑。可以通过ServletRequest和ServletResponse对象获取请求和响应的相关信息,并对其进行处理。 - 在destroy方法中,可以释放资源或进行一些清理操作。 4. 使用注解@WebFilter来配置该过滤器的映射路径和执行顺序。可以通过urlPatterns属性设置过滤器要拦截的URL路径,也可以通过value属性设置优先级。 使用Spring Boot实现过滤器的好处是可以更加方便地集成到项目中,并且与Spring的其他组件进行无缝衔接。另外,Spring Boot还提供了很多其他的功能,例如自动配置、快速启动等,可以进一步提升开发效率。 总之,通过Spring Boot实现过滤器非常简单。只需要创建一个实现Filter接口的类,添加相应的注解和配置,即可实现对请求和响应的过滤和处理。这样可以很好地控制请求的访问权限,进行统一的日志记录、异常处理等操作,提高系统的可靠性和安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凡夫贩夫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值