【问题标题】:Intercept calls to RestController in Spring Boot在 Spring Boot 中拦截对 RestController 的调用
【发布时间】:2018-10-29 16:11:41
【问题描述】:

我看过类似的问题:

how to intercept all requests in spring REST controllers?

spring boot adding http request interceptors

仍然无法找出解决方案。 我有一个运行一堆 Rest Controller 的 Spring Boot 应用程序,并希望在将请求传递给控制器​​之前拦截调用并执行一些业务逻辑。我有这个:

我的 Sprint Boot 应用程序类:

package com.amazonaws.lambda.keefinty.application;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

@SpringBootApplication(scanBasePackages="com.amazonaws.lambda.keefinty.controllers")
public class Application extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(Application.class);
    }
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

我的配置类在同一个应用程序包中:

package com.amazonaws.lambda.keefinty.application;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

import com.amazonaws.lambda.keefinty.interceptors.MyInterceptor;

@Configuration
public class MyConfiguration extends WebMvcConfigurerAdapter  {

    @Bean
    public MyInterceptor getInterceptor() {
        return new MyInterceptor();
    }

    @Override
    public void addInterceptors (InterceptorRegistry registry) {
        System.out.println("\n\nAdding interceptors\n\n");
        registry.addInterceptor(getInterceptor()).addPathPatterns("/**");
    }
}

最后是拦截器类:

package com.amazonaws.lambda.keefinty.interceptors;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

@Component
public class MyInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {

        System.out.print("\\n\\nIn MyInterceptor.preHandle\\n\\n");
        String token = request.getParameter("token");

        if (StringUtils.isBlank(token)) {
            throw new Exception("Invalid User Id or Password. Please try again.");
        }

        return true;
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
            Exception exception) throws Exception {
        // TODO Auto-generated method stub
        System.out.print("\n\nIn MyInterceptor.afterCompletion\\n\\n");
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        // TODO Auto-generated method stub
        System.out.print("\\n\\nIn MyInterceptor.postHandle\\n\\n");
    }
}

Configuration 类似乎永远不会被调用来注册拦截器,MyInterceptor 也不会。

【问题讨论】:

    标签: spring spring-boot


    【解决方案1】:

    通过声明@SpringBootApplication(scanBasePackages="com.amazonaws.lambda.keefinty.controllers"),只会发现来自com.amazonaws.lambda.keefinty.controllers 包及其子包的注释组件。

    您的MyConfiguration 类位于com.amazonaws.lambda.keefinty.application 包中,该包不是声明的组件扫描包的一部分。

    解决此问题的一种方法是从您的 @SpringBootApplication 声明中删除 scanBasePackages 参数。这将允许MyConfiguration 被组件扫描,因为默认情况下,声明@SpringBootApplication 的包被组件扫描。

    【讨论】:

    • 我已经在扫描中添加了包名,并且有效。我认为 Spring Boot 会自动在与应用程序相同的包中查找。谢谢。
    • 需要注意的是,为了加快应用程序的启动速度,指明要扫描的包实际上是一个好主意。例如,各种带有简单非 Spring 托管 POJO 的包不需要扫描。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-09
    • 2021-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多