springboot过滤器中读取自定义配置+过滤器中转发请求

本文介绍了在SpringBoot过滤器中如何读取自定义配置以及在过滤器内部如何转发请求到对应的Controller。文章详细讲解了两种解决方案,包括通过重写过滤器的init方法(未采用)和定义配置信息Bean并通过SpringContextUtils读取配置。此外,还提供了在过滤器中进行请求转发的依赖和代码示例。

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

springboot过滤器中引入自定义配置+过滤器中转发请求

一、问题

业务要求:过滤器中需要获取请求url并判断url是否是匿名就可以访问的,而匿名可访问的url需要提前定义在配置文件中,这就要求在过滤器中可以读取自定义的配置。

问题点:项目运行过程中,springboot默认加载顺序listener --》filter–》servlet。过滤器filter的优先级要高于servlet 因此 普通的采用@Value读取自定义配置是不行的。

二、在网上搜索两张方式

1、过滤器中重写init方法

ps:(这种方法我没有用,重写init过程中,报init方法在一个上级过滤器被最终定义过了)
在filter中 需要用上下文对象来获取。应用程序启动时,服务器将创建Filter的实例对象
并调用其init方法,完成对象的初始化功能
从而为后续的用户请求作好拦截的准备工作
filter对象只会创建一次,init方法也只会执行一次

2、直接定义好配置信息bean,利用SpringContextUtils在过滤器中直接读取

1、定义读取配置信息JwtProperty 类

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class JwtProperty {

    //忽略的过滤路径  在配置文件中写
    @Value("${com.winfuture.ignoreAuthUrls}")
    private  String ignoreAuthUrls;


    public String getIgnoreAuthUrls() {
        return ignoreAuthUrls;
    }


    public void setIgnoreAuthUrls(String ignoreAuthUrls) {
        this.ignoreAuthUrls = ignoreAuthUrls;
    }

    public JwtProperty() {
        this.setIgnoreAuthUrls(ignoreAuthUrls);
    }

}

2、实现ApplicationContextAware的SpringContextUtils

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

@Component
public class SpringContextUtils implements ApplicationContextAware {
    /** * 上下文对象实例 */
    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }

    /** * 获取applicationContext * * @return */
    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    /** * 经过name获取 Bean. * * @param name * @return */
    public static Object getBean(String name) {
        return getApplicationContext().getBean(name);
    }

    /** * 经过class获取Bean. * * @param clazz * @param <T> * @return */
    public static <T> T getBean(Class<T> clazz) {
        return getApplicationContext().getBean(clazz);
    }

    /**
     * * 经过name,以及Clazz返回指定的Bean * * @param name * @param clazz * @param <T>
     * * @return
     */
    public static <T> T getBean(String name, Class<T> clazz) {
        return getApplicationContext().getBean(name, clazz);
    }
}

3、在过滤器方法中直接引用定义好的JwtProperty 直接获取配置文件中的配置

# 获取bean
JwtProperty jwtProperty=SpringContextUtils.getBean(JwtProperty.class);
# 获取配置文件中忽略的url字符串
String  ignoreAuthUrls = jwtProperty.getIgnoreAuthUrls();
# 加工字符串成List

至此完成

三、另外记录一下在过滤器中判断并让请求直接转发到对应的controller

依赖

<dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.10</version>
            <scope>provided</scope>
  </dependency>

1、过滤器方法上加 @lombok.SneakyThrows //重定向注解
2、转发代码

HttpServletRequest httpServletRequest = (HttpServletRequest) request;
request.getRequestDispatcher("/user/200").forward(request, response);

欧克

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值