创建springboot过滤器

本文介绍了一个自定义的SpringBoot过滤器实现,该过滤器继承了`OncePerRequestFilter`类,并利用Spring容器注入了`MyRestTemplate`和`jxJson`等组件,通过配置使其在所有请求路径上生效。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

springboot过滤器

import org.springframework.core.ParameterizedTypeReference;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import org.springframework.web.filter.OncePerRequestFilter;

import javax.servlet.FilterChain;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.List;

public class BmXyCnsFilter extends OncePerRequestFilter {

    MyRestTemplate restTemplate;
    List list;

    @Override
    protected void initFilterBean() throws ServletException {
        ServletContext servletContext = getServletContext();
        WebApplicationContext webApplicationContext = WebApplicationContextUtils.getWebApplicationContext(servletContext);
        restTemplate= webApplicationContext.getBean(MyRestTemplate.class);
        //从spring容器中获取到jxJson bean对象
        //可查看上一个博客,路径:https://blog.youkuaiyun.com/Denial_learn/article/details/122415367?spm=1001.2014.3001.5501
        list=(List) webApplicationContext.getBean("jxJson");
    }
    @Override
    protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException {
        HttpSession session = httpServletRequest.getSession();
        Visit visit = (Visit) session.getAttribute("SESSION_VISIT_______");
        String requestURI = httpServletRequest.getRequestURI();
        String substring = requestURI.substring(requestURI.indexOf("/"), requestURI.length());
        //业务逻辑
        {业务逻辑}
        filterChain.doFilter(httpServletRequest,httpServletResponse);


    }



}

使过滤器生效

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 getBmXyFilter(){
        FilterRegistrationBean registrationBean = new FilterRegistrationBean();
        registrationBean.setFilter(new BmXyCnsFilter());
        registrationBean.addUrlPatterns("/*");
        registrationBean.setName("bmxyFilter");
        registrationBean.setOrder(2);
        return registrationBean;
    }

}
### Spring Boot过滤器的实现与配置 #### 配置方式一:使用 `Filter` 接口 在 Spring Boot 中,可以通过实现标准的 Servlet API 的 `javax.servlet.Filter` 接口来创建一个过滤器。该接口提供了一个核心方法——`doFilter()` 方法,在此方法中可以编写逻辑以处理 HTTP 请求和响应。 以下是具体实现步骤: 1. 创建类并实现 `Filter` 接口。 2. 覆盖 `init(FilterConfig filterConfig)` 和 `destroy()` 方法(可选),用于初始化和销毁资源。 3. 编写 `doFilter(ServletRequest request, ServletResponse response, FilterChain chain)` 方法中的业务逻辑。 示例代码如下: ```java import javax.servlet.*; import java.io.IOException; public class MyCustomFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("MyCustomFilter 初始化"); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("请求前操作..."); // 继续链式调用下一个过滤器或目标资源 chain.doFilter(request, response); System.out.println("响应后操作..."); } @Override public void destroy() { System.out.println("MyCustomFilter 销毁"); } } ``` 为了使上述过滤器生效,还需要将其注册到应用程序上下文中[^1]。 --- #### 注册过滤器的方式 ##### 方式二:通过 `@Component` 自动扫描 如果希望利用 Spring 容器管理过滤器实例,则可以直接将其实现标记为组件,并让其自动注入容器中。 修改上面的例子,添加注解即可完成注册: ```java import org.springframework.stereotype.Component; import javax.servlet.*; @Component public class MyCustomFilter implements Filter { ... } // 添加 @Component 注解 ``` 这种方式下,Spring Boot 会自动检测此类并将它作为一个 Bean 加入应用生命周期管理之中。 --- ##### 方式三:使用 `FilterRegistrationBean` 对于更复杂的场景或者需要指定特定属性的情况,比如设置 URL 映射规则、加载顺序等数时,推荐采用 `FilterRegistrationBean` 来显式声明过滤器对象及其行为特征。 下面是一个例子展示如何定义这样的 bean 并对其进行个性化定制: ```java import org.springframework.boot.web.servlet.filter.OrderedRequestContextFilter; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.servlet.Filter; @Configuration public class FilterConfiguration { @Bean public FilterRegistrationBean<MyCustomFilter> loggingFilter(){ FilterRegistrationBean<MyCustomFilter> registrationBean = new FilterRegistrationBean<>(); registrationBean.setFilter(new MyCustomFilter()); registrationBean.addUrlPatterns("/api/*"); // 设置匹配路径 registrationBean.setOrder(1); // 设定优先级 return registrationBean; } } ``` 这里设置了 `/api/*` 下的所有访问都会触发这个过滤器工作,并且它的执行次序被安排得较早发生 (数值越低代表越先被执行)。 --- #### 日志记录注意事项 当涉及到日志功能扩展时,请注意遵循最佳实践建议 —— 使用专门的日志框架而非简单打印语句输出调试信息。例如 Logback 是非常流行的解决方案之一;按照官方文档指导调整项目结构有助于更好地控制消息流向及格式化样式[^3]。 最终效果应该是既满足功能性需求又能保持良好的维护性和性能表现。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值