`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
通过适当设置过滤器的顺序,您可以控制它们的执行顺序,并确保按预期处理请求和响应。文章来源地址https://www.toymoban.com/news/detail-529816.html
到了这里,关于Spring boot 中的过滤器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!