javax.servlet.Filter
接口中。javax.servlet.Filter
接口定义了以下三个方法:
init(FilterConfig filterConfig)
doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
chain.doFilter(request, response)
表示将请求传递给下一个过滤器或目标资源。destroy()
在 Spring Boot 中,可以通过以下两种方式注册过滤器:
通过 @Component
注解将过滤器注册为 Spring Bean,Spring Boot 会自动加载并将其添加到过滤器链中。
示例代码:
import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
@Component
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) {
System.out.println("过滤器初始化");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
System.out.println("请求路径:" + httpRequest.getRequestURI());
chain.doFilter(request, response); // 继续传递请求
}
@Override
public void destroy() {
System.out.println("过滤器销毁");
}
}
解释:
@Component
:
/*
)。doFilter
方法:
HttpServletRequest
用于获取请求的详细信息(如路径、参数)。chain.doFilter
表示继续将请求传递给下一个过滤器或目标资源。通过 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<MyFilter> registerMyFilter() {
FilterRegistrationBean<MyFilter> registrationBean = new FilterRegistrationBean<>();
registrationBean.setFilter(new MyFilter()); // 注册过滤器
registrationBean.addUrlPatterns("/api/*"); // 仅拦截 /api/ 开头的请求
registrationBean.setOrder(1); // 设置执行顺序,值越小优先级越高
return registrationBean;
}
}
解释:
FilterRegistrationBean
:
addUrlPatterns
:
/api/*
的请求。setOrder
:
Spring 提供了一个扩展类 OncePerRequestFilter
,它是对标准过滤器的增强,用于确保在一次请求中只执行一次过滤逻辑(防止重复过滤)。
示例代码:
import org.springframework.web.filter.OncePerRequestFilter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class MyOncePerRequestFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
System.out.println("请求路径:" + request.getRequestURI());
filterChain.doFilter(request, response); // 继续传递请求
}
}
注册方式: 可以通过 @Component
或 FilterRegistrationBean
注册,方式与标准过滤器一致。
解释:
OncePerRequestFilter
:
doFilterInternal
:
Filter
的 doFilter
类似。在 Spring Boot 中,多个过滤器的执行顺序由以下规则决定:
示例:
@Component
@Order(1) // 优先级最高
public class FirstFilter implements Filter {
...
}
@Component
@Order(2) // 优先级次之
public class SecondFilter implements Filter {
...
}
@Order
注解设置优先级(值越小优先级越高)。示例:
registrationBean.setOrder(1);
FilterRegistrationBean#setOrder
方法设置优先级。用户认证和授权
请求日志记录
示例:
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
System.out.println("请求路径:" + httpRequest.getRequestURI());
chain.doFilter(request, response);
}
跨域处理
示例:
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletResponse httpResponse = (HttpServletResponse) response;
httpResponse.setHeader("Access-Control-Allow-Origin", "*");
httpResponse.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
chain.doFilter(request, response);
}
加解密
避免业务逻辑的复杂化:
避免重复过滤:
OncePerRequestFilter
防止在同一个请求中多次执行过滤器逻辑。路径匹配规则:
addUrlPatterns
或在 doFilter
中手动判断,确保过滤器只作用于必要的路径。资源拦截控制:
.css
, .js
)的拦截,避免对静态资源应用不必要的逻辑。以一个常见的 Spring Boot Web 应用为例,处理一个请求可能会经过多个环节:
[客户端请求]
↓
[Filter1 -> Filter2 -> ... -> FilterN] // 过滤器链
↓
[Servlet Container] // DispatcherServlet
↓
[Spring MVC (Interceptor)] // 可选
↓
[Controller / RestController 方法]
↓
[视图解析或返回响应]
↑
[FilterN -> ... -> Filter1] // 响应回程,也可以在过滤器里做后置处理
↑
[客户端接收响应]
Filter.doFilter
中,如果调用 chain.doFilter(request, response)
,请求才会进入下一个过滤器或目标 Servlet。
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- huatuo2.com 版权所有 湘ICP备2023021991号-2
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务