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);
欧克