龙空技术网

基于 Spring Boot 的过滤器详解

ijunfu 34

前言:

今天咱们对“java过滤器使用代码是什么”大体比较注意,小伙伴们都需要剖析一些“java过滤器使用代码是什么”的相关知识。那么小编在网上汇集了一些关于“java过滤器使用代码是什么””的相关内容,希望各位老铁们能喜欢,朋友们快快来了解一下吧!

1. 引言

在构建 Web 应用程序时,开发者经常需要在请求处理的早期阶段执行一些全局逻辑,例如请求验证、编码处理、日志记录等。Spring Boot 提供了基于 Servlet 规范的过滤器(Filter)机制,用于在请求到达控制器之前对其进行预处理。本文将详细介绍过滤器的基本概念、设计原则、常见应用场景,并提供具体实现和示例代码。

2. 基本概念

过滤器(Filter) 是 Java Servlet 规范的一部分,用于对进入 Servlet 的请求和从 Servlet 返回的响应进行过滤。过滤器可对请求进行修改,或者根据条件决定是否继续将请求传递给下一个过滤器或 Servlet。

过滤器通常用于以下场景:

身份验证:确保请求已通过身份验证。日志记录:记录请求的相关信息,如 IP 地址、请求路径等。编码设置:设置请求和响应的字符编码。跨域资源共享 (CORS):允许跨域请求。3. 设计原则横切关注点解耦:过滤器专门处理特定的全局任务(如日志记录、认证),从业务逻辑中解耦。责任链模式:多个过滤器可以串联起来,共同处理请求和响应。每个过滤器可以选择是否继续传递请求。高效性:由于过滤器位于请求的入口处,执行频繁,因此需要高效执行,以减少性能开销。4. 应用场景全局日志记录:记录每个请求的详细信息,例如请求路径、IP 地址、请求时间等。跨域请求支持:通过过滤器实现 CORS,以允许来自不同域的请求。安全认证:拦截未经授权的请求,进行身份验证。压缩响应:根据请求头信息,自动对响应进行 GZIP 压缩。5. 实现过滤器

5.1 项目结构

src├── main│   ├── java│   │   └── com│   │       └── example│   │           ├── config│   │           │   └── FilterConfig.java│   │           ├── filter│   │           │   └── LoggingFilter.java│   │           ├── controller│   │           │   └── UserController.java│   │           ├── model│   │           │   └── User.java│   │           └── service│   │               └── UserService.java│   └── resources│       └── application.properties

5.2 创建过滤器

以下 LoggingFilter 用于记录每个请求的 URL、请求方法以及请求处理的时长。

package com.example.filter;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.HttpServletRequest;import java.io.IOException;public class LoggingFilter implements Filter {    @Override    public void init(FilterConfig filterConfig) throws ServletException {        // 初始化代码,如果需要    }    @Override    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {        HttpServletRequest httpRequest = (HttpServletRequest) request;        long startTime = System.currentTimeMillis();                System.out.println("Request URL: " + httpRequest.getRequestURL());        System.out.println("Request Method: " + httpRequest.getMethod());                // 继续请求处理        chain.doFilter(request, response);                long duration = System.currentTimeMillis() - startTime;        System.out.println("Request processed in " + duration + " ms");    }    @Override    public void destroy() {        // 清理代码,如果需要    }}

5.3 配置过滤器

在 Spring Boot 中可以通过 @Configuration 注解注册过滤器。我们可以在 FilterConfig 类中进行配置。

package com.example.config;import com.example.filter.LoggingFilter;import org.springframework.boot.web.servlet.FilterRegistrationBean;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;@Configurationpublic class FilterConfig {    @Bean    public FilterRegistrationBean<LoggingFilter> loggingFilter() {        FilterRegistrationBean<LoggingFilter> registrationBean = new FilterRegistrationBean<>();        registrationBean.setFilter(new LoggingFilter());        registrationBean.addUrlPatterns("/api/*"); // 只对 /api 路径下的请求生效        registrationBean.setOrder(1); // 设置过滤器执行顺序,值越小优先级越高        return registrationBean;    }}

5.4 控制器类

一个简单的控制器用于演示过滤器的效果。

package com.example.controller;import com.example.model.User;import org.springframework.web.bind.annotation.*;@RestController@RequestMapping("/api/users")public class UserController {    @GetMapping("/{id}")    public User getUserById(@PathVariable Long id) {        User user = new User();        user.setId(id);        user.setName("John Doe");        return user;    }    @PostMapping    public User createUser(@RequestBody User user) {        user.setId(1L);        return user;    }}

5.5 模型类

package com.example.model;public class User {    private Long id;    private String name;    // Getters and Setters}
6. 高级使用

6.1 过滤特定请求类型

可以根据请求方法或头部信息来设置过滤条件。

@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {    HttpServletRequest httpRequest = (HttpServletRequest) request;    if ("POST".equalsIgnoreCase(httpRequest.getMethod())) {        // 只对 POST 请求进行处理    }    chain.doFilter(request, response);}

6.2 处理跨域请求

过滤器可以用于处理 CORS 问题,允许跨域访问:

@Overridepublic 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);}
7. 过滤器与拦截器的区别执行顺序:过滤器位于 Servlet 容器的层级上,优先于 Spring MVC 执行;拦截器则是在 Controller 处理之前。作用范围:过滤器处理的是整个请求和响应,而拦截器更专注于 Spring MVC 的控制器层。灵活性:拦截器能深入到 Spring MVC 的上下文中,过滤器只能对整个请求生命周期起作用。8. 总结

过滤器在 Spring Boot 应用中为开发者提供了一个全局预处理和后处理的机制。它适合处理与请求、响应相关的横切关注点,尤其是在安全认证、日志记录、跨域处理等方面表现得尤为出色。通过合理设计和配置过滤器,可以提升系统的灵活性和可维护性。

希望这篇博客帮助你深入理解 Spring Boot 中的过滤器,并学会如何在实际项目中高效应用。如果有进一步问题,欢迎讨论!

标签: #java过滤器使用代码是什么