前言:
今天咱们对“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过滤器使用代码是什么