SpringBoot-3 拦截器注入配置

如果拦截器加载的时间点在Spring的上下文初始化之前,导致注入的值为null,您可以尝试以下两种解决方法:

  1. 使用@PostConstruct注解:
    在拦截器中使用@PostConstruct注解标记一个初始化方法,在该方法中手动获取配置值,并进行相应的处理。这样可以确保在拦截器初始化完成后,配置值已经被正确加载。例如:
@Component
public class TokenInterceptor implements HandlerInterceptor {

    @Value("${authorize.token}")
    private String expectedToken;

    private String cachedExpectedToken;

    @PostConstruct
    public void init() {
        // 在初始化方法中获取配置值并缓存
        cachedExpectedToken = expectedToken;
    }

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        // 使用缓存的配置值进行处理
        String token = request.getHeader("Authorization");
        System.out.println("从header中获取到token:" + token);
        System.out.println("expectedToken:" + cachedExpectedToken);
        if (token != null && token.equals(cachedExpectedToken)) {
            return true;
        } else {
            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
            response.getWriter().write("无权限访问");
            return false;
        }
    }

    // 省略其他方法
}
  1. 自定义属性读取类:
    创建一个自定义的属性读取类,在该类中手动读取配置文件中的属性值,并在拦截器中使用该属性读取类获取配置值。这样可以确保配置值在拦截器初始化之前已经被正确加载。例如:
@Component
public class TokenProperties {

    @Value("${authorize.token}")
    private String expectedToken;

    public String getExpectedToken() {
        return expectedToken;
    }
}

@Component
public class TokenInterceptor implements HandlerInterceptor {

    private final TokenProperties tokenProperties;

    @Autowired
    public TokenInterceptor(TokenProperties tokenProperties) {
        this.tokenProperties = tokenProperties;
    }

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        // 使用属性读取类获取配置值进行处理
        String token = request.getHeader("Authorization");
        System.out.println("从header中获取到token:" + token);
        System.out.println("expectedToken:" + tokenProperties.getExpectedToken());
        if (token != null && token.equals(tokenProperties.getExpectedToken())) {
            return true;
        } else {
            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
            response.getWriter().write("无权限访问");
            return false;
        }
    }

    // 省略其他方法
}
posted @ 2023-08-03 11:15  zhaogaojian  阅读(200)  评论(0编辑  收藏  举报