在 Spring Boot 中使用 Filters
Spring Boot过滤器是构建Web应用程序的重要组成部分,本文我们将讨论以下几个问题:
什么是过滤器?为什么我们需
Spring Boot过滤器是构建Web应用程序的重要组成部分,本文我们将讨论以下几个问题:
什么是过滤器?为什么我们需要过滤器?在Spring Boot应用程序中添加过滤器的不同方法如何使用特定的URL模式注册过滤器它们允许您拦截请求和响应,以便应用自定义逻辑,例如身份验证、日志记录或修改请求/响应对象。
过滤器简介过滤器是Java Servlet API的一部分,它们允许您预处理和后处理请求和响应。
创建过滤器要在Spring Boot中创建过滤器,您可以实现javax.servlet.Filter接口或扩展OncePerRequestFilter类。OncePerRequestFilter确保您的过滤器每个请求只执行一次。
@RestController@RequestMapping("/customer")public CustomerController { @GetMapping public String getMessage(){ return "welcome to filter session"; }}@Component@Slf4jpublic MessageFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { log.info("[MessageFilter] - Inside doFilter method"); log.info("Local Port : " + request.getLocalPort()); log.info("Server Name : " + request.getServerName()); HttpServletRequest httpServletRequest = (HttpServletRequest) request; log.info("Method Name : " + httpServletRequest.getMethod()); log.info("Request URI : " + httpServletRequest.getRequestURI()); log.info("Servlet Path : " + httpServletRequest.getServletPath()); chain.doFilter(request, response); }}要测试此过滤器,请访问 http://localhost:9898/customer
过滤器的顺序过滤器的应用顺序可以通过@Order注解或
@Component@Slf4j@Order(2)public MessageFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { log.info("[MessageFilter] - Inside doFilter method"); log.info("Local Port : " + request.getLocalPort()); log.info("Server Name : " + request.getServerName()); HttpServletRequest httpServletRequest = (HttpServletRequest) request; log.info("Method Name : " + httpServletRequest.getMethod()); log.info("Request URI : " + httpServletRequest.getRequestURI()); log.info("Servlet Path : " + httpServletRequest.getServletPath()); chain.doFilter(request, response); }}@Component@Slf4j@Order(1)public ProductFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { log.info("[ProductFilter] - Inside doFilter method"); log.info("Local Port : " + request.getLocalPort()); log.info("Server Name : " + request.getServerName()); HttpServletRequest httpServletRequest = (HttpServletRequest) request; log.info("Method Name : " + httpServletRequest.getMethod()); log.info("Request URI : " + httpServletRequest.getRequestURI()); log.info("Servlet Path : " + httpServletRequest.getServletPath()); chain.doFilter(request, response); }}如果您只想打印MessageFilter并跳过ProductFilter
要在访问/customer API时仅显示MessageFilter的日志,您需要有条件地绕过ProductFilter对/customer端点的过滤。您可以通过修改ProductFilter来跳过特定端点的过滤来实现这一点。
@Component@Slf4j@Order(1) // 确保此过滤器在MessageFilter之前执行public ProductFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpServletRequest = (HttpServletRequest) request; String requestURI = httpServletRequest.getRequestURI(); if ("/customer".equals(requestURI)) { chain.doFilter(request, response); return; // 跳过过滤器的其余部分 } log.info("[ProductFilter] - Inside doFilter method"); log.info("Local Port : " + request.getLocalPort()); log.info("Server Name : " + request.getServerName()); log.info("Method Name : " + httpServletRequest.getMethod()); log.info("Request URI : " + requestURI); log.info("Servlet Path : " + httpServletRequest.getServletPath()); chain.doFilter(request, response); }}注册过滤器
@Configurationpublic FilterConfig { @Bean public FilterRegistrationBean loggingFilter(){ FilterRegistrationBean registrationBean = new FilterRegistrationBean<>(); registrationBean.setFilter(new MessageFilter()); registrationBean.addUrlPatterns("/customer/*"); // 如果需要,指定URL模式 return registrationBean; }}OncePerRequestFilter
public ProductFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { log.info("[ProductFilter] - Inside doFilter method"); log.info("Local Port : " + request.getLocalPort()); log.info("Server Name : " + request.getServerName()); HttpServletRequest httpServletRequest = (HttpServletRequest) request; log.info("Method Name : " + httpServletRequest.getMethod()); log.info("Request URI : " + httpServletRequest.getRequestURI()); log.info("Servlet Path : " + httpServletRequest.getServletPath()); filterChain.doFilter(request, response); }}要测试此过滤器,请访问: http://localhost:9898/product
更多关于Spring框架的学习,请关注SpringForAll社区,专注于分享关于Spring的一切。