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()`之前执行自己的逻辑,然后将请求传递给下一个过滤器或目标资源。然后,第二个过滤器执行自己的逻辑,以此类推。

通过适当设置过滤器的顺序,您可以控制它们的执行顺序,并确保按预期处理请求和响应。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
当使用Spring Boot创建过滤器时,你需要遵循以下步骤: 1. 创建一个过滤器类:首先,你需要创建一个实现`javax.servlet.Filter`接口的过滤器类。这个接口定义了在请求处理过程要执行的方法。 ```java @Component public class CustomFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 在请求处理之前执行的操作 chain.doFilter(request, response); // 将请求传递给下一个过滤器或目标资源 // 在请求处理之后执行的操作 } // 如果需要,可以实现init()和destroy()方法 } ``` 2. 注册过滤器:将过滤器注册到Spring Boot应用程序,以便它能够拦截到相应的请求。你可以通过实现`FilterRegistrationBean`并将过滤器类添加到注册bean来完成注册。 ```java @Configuration public class WebConfig { @Bean public FilterRegistrationBean<CustomFilter> customFilterRegistrationBean() { FilterRegistrationBean<CustomFilter> registrationBean = new FilterRegistrationBean<>(); registrationBean.setFilter(new CustomFilter()); registrationBean.addUrlPatterns("/*"); // 设置过滤器拦截的URL模式 return registrationBean; } } ``` 3. 配置过滤器:如果需要对特定的URL进行过滤或排除某些URL,你可以在过滤器进行相应的配置。 ```java @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request; String requestURI = httpRequest.getRequestURI(); if (requestURI.startsWith("/admin")) { // 对以"/admin"开头的URL进行过滤操作 chain.doFilter(request, response); } else { // 对其他URL不进行过滤,直接传递给下一个过滤器或目标资源 chain.doFilter(request, response); } } ``` 以上就是使用Spring Boot创建过滤器的基本步骤。创建和注册过滤器后,它将在请求处理过程执行定义的操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

田猿笔记

写文章不容易,希望大家小小打赏

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

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

打赏作者

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

抵扣说明:

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

余额充值