Spring boot 中的过滤器

这篇具有很好参考价值的文章主要介绍了Spring boot 中的过滤器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

`javax.servlet.Filter`接口定义了几个方法:

其中一些经常在过滤器的实现中使用。以下是常用的几个方法:

1. `doFilter()`: 这是过滤器的核心方法,用于实现过滤器的逻辑。在该方法中,您可以对请求进行预处理、修改请求参数、验证身份、记录日志等操作,然后通过调用`FilterChain`的`doFilter()`方法将请求传递给下一个过滤器或目标资源。在响应返回客户端之前,也可以在此方法中执行一些操作。

```java
void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
    throws IOException, ServletException;
```

2. `init()`: `init()`方法在过滤器初始化时调用,用于执行一些初始化操作。这个方法在过滤器的生命周期中只会被调用一次。您可以在这里进行一些设置和准备工作。

```java
void init(FilterConfig filterConfig) throws ServletException;
```

3. `destroy()`: `destroy()`方法在过滤器被销毁时调用,用于释放资源和执行一些清理操作。这个方法在过滤器的生命周期结束时被调用,通常在应用程序关闭时。

```java
void destroy();
```

这些方法提供了过滤器的基本功能和生命周期管理。您可以根据需要在这些方法中编写自定义逻辑来处理请求和响应。

除了上述方法外,`FilterConfig`接口还提供了其他一些方法,用于获取过滤器的初始化参数和配置信息。例如:

- `getFilterName()`: 获取过滤器的名称。
- `getInitParameter(String name)`: 获取指定名称的初始化参数值。
- `getInitParameterNames()`: 获取所有初始化参数的名称。

这些方法可以在`init()`方法中使用,以获取过滤器的配置信息。


实例1:自定义过滤器来验证身份:

在Spring Boot中,您可以使用自定义过滤器来验证身份。以下是一个示例,演示如何在过滤器中实现身份验证逻辑:

import org.springframework.util.StringUtils;
import org.springframework.web.filter.GenericFilterBean;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class AuthenticationFilter extends GenericFilterBean {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        HttpServletResponse httpResponse = (HttpServletResponse) response;

        // 从请求头中获取授权信息
        String authorizationHeader = httpRequest.getHeader("Authorization");

        // 检查授权信息是否存在且以Bearer开头
        if (StringUtils.hasText(authorizationHeader) && authorizationHeader.startsWith("Bearer ")) {
            // 提取令牌
            String token = authorizationHeader.substring(7);

            // 在此处执行身份验证逻辑
            if (validateToken(token)) {
                // 身份验证成功,继续处理请求
                chain.doFilter(request, response);
            } else {
                // 身份验证失败,返回未授权错误
                httpResponse.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
            }
        } else {
            // 授权信息不合法,返回未授权错误
            httpResponse.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
        }
    }

    private boolean validateToken(String token) {
        // 在此处进行身份验证逻辑,例如验证JWT的有效性
        // 如果验证通过,返回true;否则返回false
        // 根据实际情况进行实现
        // ...
    }
}

在上述示例中,我们创建了一个自定义的过滤器`AuthenticationFilter`,继承了`GenericFilterBean`类。在`doFilter()`方法中,我们获取请求头中的授权信息,并验证授权信息是否合法。

在`validateToken()`方法中,您可以执行实际的身份验证逻辑,例如验证JWT的有效性、检查数据库中的用户凭证等。根据实际情况进行实现。

如果身份验证成功,我们调用`chain.doFilter(request, response)`继续处理请求。如果身份验证失败,我们设置响应状态为`SC_UNAUTHORIZED`表示未授权。

要将该过滤器应用于Spring Boot应用程序,您需要在配置类中注册该过滤器:

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FilterConfig {

    @Bean
    public FilterRegistrationBean<AuthenticationFilter> authenticationFilterRegistration() {
        FilterRegistrationBean<AuthenticationFilter> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(new AuthenticationFilter());
        registrationBean.addUrlPatterns("/api/*"); // 设置需要进行身份验证的URL模式
        return registrationBean;
    }
}

在上述示例中,我们使用`FilterRegistrationBean`将自定义过滤器`AuthenticationFilter`注册到应用程序上下文,并指定要进行身份验证的URL模式(例如`/api/*`)。

请根据您的实

际需求和身份验证逻辑进行适当的修改和扩展。

这个示例仅演示了如何在自定义过滤器中进行身份验证,您可以根据您的具体要求进行进一步的自定义和优化,例如从数据库中获取用户信息进行验证、使用JWT验证令牌、使用Spring Security进行身份验证等。


实例2:Spring Boot中使用多个过滤器:

在Spring Boot中使用多个过滤器的步骤如下:

1. 创建多个过滤器类:为每个过滤器创建一个实现`javax.servlet.Filter`接口的类,并实现其`doFilter()`方法来定义每个过滤器的逻辑。例如,我们创建两个过滤器类:`Filter1`和`Filter2`。

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

public class Filter1 implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        // 过滤器1的逻辑
        // ...

        // 调用下一个过滤器或目标资源
        chain.doFilter(request, response);

        // 在响应返回给客户端之前的逻辑
        // ...
    }

    // 其他方法...
}

public class Filter2 implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        // 过滤器2的逻辑
        // ...

        // 调用下一个过滤器或目标资源
        chain.doFilter(request, response);

        // 在响应返回给客户端之前的逻辑
        // ...
    }

    // 其他方法...
}

2. 注册多个过滤器:在Spring Boot应用程序的配置类中,使用`FilterRegistrationBean`为每个过滤器类注册一个过滤器。在注册过滤器时,可以指定不同的URL模式和顺序。

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FilterConfig {

    @Bean
    public FilterRegistrationBean<Filter1> filter1Registration() {
        FilterRegistrationBean<Filter1> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(new Filter1());
        registrationBean.addUrlPatterns("/url1"); // 设置过滤器1要过滤的URL模式
        registrationBean.setOrder(1); // 设置过滤器1的顺序
        return registrationBean;
    }

    @Bean
    public FilterRegistrationBean<Filter2> filter2Registration() {
        FilterRegistrationBean<Filter2> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(new Filter2());
        registrationBean.addUrlPatterns("/url2"); // 设置过滤器2要过滤的URL模式
        registrationBean.setOrder(2); // 设置过滤器2的顺序
        return registrationBean;
    }
}

在上述示例中,我们为两个过滤器类`Filter1`和`Filter2`分别创建了一个`FilterRegistrationBean`。在每个`FilterRegistrationBean`中,我们设置了过滤器实例、要过滤的URL模式和过滤器的顺序。根据需要,您可以设置不同的URL模式和顺序。

请注意,过滤器的执行顺序由`setOrder()`方法指定,较小的值表示较高的优先级,较高的值表示较低的优先级。

通过上述步骤,成功创建了多个过滤器并将它们注册到Spring Boot应用程序中。每个过滤器将根据其设置的顺序在请求到达控制器之前进行处理。

请注意,在多个过滤器中的`chain.doFilter(request, response)`语句的调用顺序将决定它们的执行顺序。第一个过滤器在调用`chain.doFilter()`之前执行自己的逻辑,然后将请求传递给下一个过滤器或目标资源。然后,第二个过滤器执行自己的逻辑,以此类推。

通过适当设置过滤器的顺序,您可以控制它们的执行顺序,并确保按预期处理请求和响应。文章来源地址https://www.toymoban.com/news/detail-529816.html

到了这里,关于Spring boot 中的过滤器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 在Spring Boot中注册过滤器几种方式

    1. 实现 Filter 接口并使用 @WebFilter 注解:(适用于Servlet API项目) 2. 使用Spring的 FilterRegistrationBean (推荐) 3. 定义为 Spring Bean 并手动配置到 Servlet 容器中 注意:这种方法通常在需要部署为 WAR包 到非嵌入式Servlet容器时采用。而在大多数Spring Boot应用中,建议使用前两种注册过

    2024年01月19日
    浏览(25)
  • 在Spring boot中 使用JWT和过滤器实现登录认证

    在navicat中运行如下sql,准备一张user表 导入pom.xml坐标 在工utils包下创建一个用于生成和解析JWT 令牌的工具类 在pojo包下创建user类 在mapper包下添加 UserMapper接口 在service包下添加 UserService类 在utils包下添加统一响应结果封装类 在controller包下添加LoginController类 这样登录获取toke

    2024年02月06日
    浏览(27)
  • Spring中的拦截器与过滤器:原理、区别与案例解析

    前言 在Web应用中,我们经常需要对用户的请求进行某种处理,比如权限验证、日志记录等。 Spring框架提供了两种机制来实现这一需求:拦截器和过滤器。虽然它们的目标相似,但在使用上存在一些差异。本篇文章我们将详细探讨这两种机制的原理、区别,希望能给各位大佬

    2024年04月23日
    浏览(35)
  • Spring Security 中的过滤器链是什么?它的作用是什么

    Spring Security是一个安全框架,它提供了强大的安全保护功能,可以帮助开发者更加方便地实现应用程序的安全性。Spring Security中的过滤器链是其中一个非常重要的部分,它起到了非常重要的作用。本文将介绍什么是Spring Security中的过滤器链,以及它的作用和如何使用它。同时

    2024年02月06日
    浏览(39)
  • Spring Security内置过滤器详解

    相关文章: OAuth2的定义和运行流程 Spring Security OAuth实现Gitee快捷登录 Spring Security OAuth实现GitHub快捷登录 Spring Security的过滤器链机制 Spring Security OAuth Client配置加载源码分析 根据前面的示例,我们已经知道启动时会加载18个过滤器,并且已经知道了请求会匹配到DefaultSecurityF

    2024年02月05日
    浏览(30)
  • Spring Cloud Gateway 过滤器

    Spring Cloud Gateway 过滤器的种类有30多种。 官文文档地址: Spring Cloud Gateway https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gatewayfilter-factories Spring Cloud Gateway大体可以分为下面两种类型的过滤器: 1、内置的过滤器         1.1、内置的局部过滤器         1.2、内置的全

    2024年03月28日
    浏览(41)
  • Spring Cloud GateWay 全局过滤器

    这是一个自定义的 Spring Cloud Gateway 全局过滤器(Global Filter)。在 Spring Cloud Gateway 中,全局过滤器可以在请求被路由到目标服务之前或之后执行一些操作。这个过滤器实现了 GlobalFilter 接口和 Ordered 接口,这两个接口的作用如下: GlobalFilter 接口: 这是一个 Spring Cloud Gateway 提

    2024年02月11日
    浏览(29)
  • Spring Cloud Gateway 过滤器详解

    Spring Cloud Gateway根据作用范围划分为:GatewayFilter和GlobalFilter 由filter工作流程点,可以知道filter有着非常重要的作用,在“pre”类型的过滤器可以做参数校验、权限校验、流量监控、日志输出、协议转换等,在“post”类型的过滤器中可以做响应内容、响应头的修改,日志的输

    2023年04月08日
    浏览(27)
  • Spring/SpringBoot 过滤器修改、获取http 请求request中的参数 和 response返回值,比如修改请求体和响应体的字符编码

    通过自定义filter,RequestWrapper,ResponseWrapper 处理请求和响应数据,比如修改请求体和响应体的字符编码 1.request 和 response 中的数据都是 存在流中的(缓存中)获取一次就没有了,需要重新写回去。所以需要两个包装类分别继承HttpServletRequestWrapper 和 HttpServletResponseWrapper 对 r

    2024年02月15日
    浏览(26)
  • Spring Cloud Gateway过滤器GlobalFilter详解

    一、过滤器的场景 在springCloud架构中,网关是必不可少的组件,它用于服务路由的转发。对客户端进行屏蔽微服务的具体细节,客户端只需要和网关进行交互。所以网关顾名思义,就是网络的一个关卡。它就是一座城的城门守卫。所以这个守卫就可以做很多工作,比如对来访

    2024年02月14日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包