SpringBoot框架下使用过滤器Filter

SpringBoot框架下使用过滤器Filter

Java过滤器能够对目标资源的请求和响应进行截取。

过滤器的配置比较简单,直接实现Filter 接口即可,也可以通过@WebFilter注解实现对特定URL拦截,看到Filter 接口中定义了三个方法

  • init() :该方法在容器启动初始化过滤器时被调用,它在 Filter 的整个生命周期只会被调用一次。注意:这个方法必须执行成功,否则过滤器会不起作用。
  • doFilter() :容器中的每一次请求都会调用该方法, FilterChain 用来调用下一个过滤器 Filter。
  • destroy(): 当容器销毁 过滤器实例时调用该方法,一般在方法中销毁或关闭资源,在过滤器 Filter 的整个生命周期也只会被调用一次

1. 第一种方式:注解的方式@WebFilter,@ServletComponentScan

1.1 创建过滤器

定义一个拦截器类实现Filter接口实现doFilter方法(每一次请求都会调用)

src/main/java/com/guo/springboot/filter/MyFilter.java

package com.guo.springboot.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter(urlPatterns = "/myfilter")
public class MyFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("------进入过滤器--------");
        filterChain.doFilter(servletRequest,servletResponse);
    }
}

1.2 SpringBoot入口类开启包扫描

SpringBoot程序入口类,配置扫描包注解

src/main/java/com/guo/springboot/Application.java

package com.guo.springboot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
@SpringBootApplication
@ServletComponentScan(basePackages = "com.guo.springboot.filter")
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

1.3 结果分析

这里只是一个URL请求的过滤,没有制作的请求的页面所以这里请求404找不到页面,咱们目的是测试请求的过滤,,看程序。
在这里插入图片描述
控制台这里打印出过滤器的逻辑处理结果,很很明显过滤了本次请求
在这里插入图片描述

2. 第二种方式:配置类组件FilterRegistrationBean

在这里插入图片描述

2.1 创建过滤器

创建过滤器类实现Filter接口,重写doFilter方法

src/main/java/cosm/guo/springboot/filter/MyFilter.java

package com.guo.springboot.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

public class MyFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("------进入过滤器--------");
        filterChain.doFilter(servletRequest,servletResponse);
    }
}

2.2 配置类——配置过滤器

配置类——配置过滤器的拦截URL

src/main/java/com/guo/springboot/config/FilterConfig.java

package com.guo.springboot.config;

import com.guo.springboot.filter.MyFilter;
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 myFilterRegistrationBean(){
        //注册过滤器
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new MyFilter());
        //添加过滤路径
        filterRegistrationBean.addUrlPatterns("/user/*");
        return filterRegistrationBean;
    }
}

2.3 创建控制层

控制层

src/main/java/com/guo/springboot/controller/UserController.java

package com.guo.springboot.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class UserController {
    @RequestMapping("/user/detail")
    public @ResponseBody String userDetail(){
        return "UserDetail";
    }
    @RequestMapping("/center")
    public @ResponseBody String center(){
        return "center";
    }
}

2.4 结果分析

在这里插入图片描述

过滤器配置的过滤路径是/user/*,这里的请求路径是/user/detail,这里成功被过滤了

在这里插入图片描述

<think>好的,我现在需要帮用户解决在Spring Boot中如何实现和使用Filter过滤器的问题,并且提供一个示例。首先,我得回忆一下Spring BootFilter的基本用法。 用户可能已经知道FilterJava Web开发中的组件,用于拦截请求和响应。但在Spring Boot中,配置Filter的方式可能和传统的Spring MVC有些不同,因为Spring Boot更倾向于使用自动配置和简化的配置方式。 首先,我应该考虑两种主要的实现方式:使用注解和通过配置类。这两种方法都比较常用,但各有优缺点。使用@WebFilter注解可能更简单,特别是对于新手来说,但需要配合@ServletComponentScan使用。而通过配置类的方式则更灵活,可以在代码中控制Filter的顺序和注册。 接下来,我需要确定步骤是否正确。比如,使用@WebFilter时,确实需要在启动类上添加@ServletComponentScan,这样才能扫描到Servlet组件,包括Filter。然后,实现Filter接口,重写doFilter方法,并在注解中指定urlPatterns。这部分没问题。 然后是配置类的方式,通过FilterRegistrationBean来注册Filter。这里需要注意的是,FilterRegistrationBean可以设置顺序,所以如果有多个Filter,顺序很重要。需要告诉用户如何设置order属性,比如使用Ordered.HIGHEST_PRECEDENCE来指定最高优先级。 示例代码部分,我需要确保代码正确。比如,在注解方式中,Filter类加上@WebFilter和@Component是否正确?可能有些问题,因为@WebFilter已经标记了这是一个Filter,但可能需要@Component来让Spring管理它?或者是否只需要@WebFilter加上@ServletComponentScan就可以了?可能需要验证一下,避免重复注解。 另外,在配置类中,创建FilterRegistrationBean的实例,并设置FilterurlPatterns,这部分是正确的。同时,设置order也是可行的。 然后,用户可能需要知道如何测试Filter是否生效,比如通过日志输出或者拦截请求。在示例中,添加日志记录请求URL和耗时是好的做法,帮助用户理解Filter的作用。 关于引用,用户提供的引用是关于布隆过滤器的,可能不相关,所以可能不需要参考这个。但根据系统指令,需要添加引用标识,但这里可能没有合适的引用,所以可能需要忽略或者寻找其他引用来源,但用户提供的引用可能不适用,所以或许可以省略。 生成相关问题的时候,需要考虑用户可能的后续问题,比如Filter的执行顺序、与拦截器的区别、异常处理等。这些都是常见的后续问题。 最后,确保所有步骤清晰,代码正确,并且使用中文回答。同时,检查LaTeX格式是否符合要求,但在这个问题中可能用不到数学公式,所以可能不需要处理。但根据系统指令,如果有行内公式需要用$...$,独立公式用$$...$$,但这个问题可能不涉及,所以可能没有问题。</think>在Spring Boot中实现过滤器(Filter)可以通过两种主要方式:注解配置和编程式配置。以下是具体实现步骤和示例: ### 一、注解方式实现 1. **创建过滤器类** ```java @WebFilter(urlPatterns = "/*") @Component public class LogFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { long start = System.currentTimeMillis(); HttpServletRequest req = (HttpServletRequest) request; System.out.println("Request URI: " + req.getRequestURI()); chain.doFilter(request, response); System.out.println("Request completed in " + (System.currentTimeMillis() - start) + "ms"); } } ``` 2. **启动类添加扫描注解** ```java @SpringBootApplication @ServletComponentScan // 关键注解,用于扫描@WebFilter public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` ### 二、编程式配置(推荐方式) 1. **创建过滤器类** ```java public class AuthFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; String token = req.getHeader("Authorization"); if (!validateToken(token)) { ((HttpServletResponse) response).sendError(401); return; } chain.doFilter(request, response); } } ``` 2. **注册过滤器配置类** ```java @Configuration public class FilterConfig { @Bean public FilterRegistrationBean<AuthFilter> authFilter() { FilterRegistrationBean<AuthFilter> registration = new FilterRegistrationBean<>(); registration.setFilter(new AuthFilter()); registration.addUrlPatterns("/api/*"); registration.setOrder(Ordered.HIGHEST_PRECEDENCE); // 设置最高优先级 return registration; } } ``` ### 三、过滤器执行原理 1. 请求进入Servlet容器后首先经过过滤器链 2. 按`Order`值从小到大顺序执行(值越小优先级越高) 3. 最终到达目标Controller处理 4. 响应时按相反顺序通过过滤器链返回 [^1]: 示例参考Spring Boot官方文档中关于Servlet Filter的配置说明
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

848698119

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值