SpringBoot:控制器&过滤器已初始化但未被调用

时间:2016-07-18 09:07:29

标签: java servlets spring-boot

我正在运行非常简单的spring-boot应用程序:

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

我有一个简单的过滤器:

@Component
public class MyFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException     {
       // This is getting called ! 
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // some logic
        filterChain.doFilter(request, response);
    }

    @Override
    public void destroy() {
    }
}

我有一个返回索引页的控制器:

@Controller
public class HomeController {

    @RequestMapping("/")
    public String index() {
        return "index";
    }

}

在请求索引页面时我的过滤器没有被调用,尽管我认为它应该被调用。

在我的日志中,我看到:

2016-07-18 11:59:51.840  INFO 15623 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean  : Mapping filter: 'MyFilter' to: [/*]

我错过了什么?

修改 在这里发表评论之后,我看到我的控制器也没有被调用。所以这不是过滤器的问题,但这是一个更大问题的症状。

这是我的项目结构:

.
├── Dockerfile
├── build.gradle
├── gradlew
├── settings.gradle
├── src
│   ├── main
│   │   ├── java
│   │   │   └── com
│   │   │       └── mypackage
│   │   │           ├── Application.java
│   │   │           ├── GreetingController.java
│   │   │           ├── HomeController.java
│   │   │           └── MyFilter.java
│   │   └── resources
│   │       ├── application.yml
│   │       └── templates
│   │           ├── greeting.html
│   │           └── index.html

我正在使用gradle构建一个jar文件:

./gradlew clean build

运行它:

java -jar build/libs/sample-webapp-1.0.0.jar

我正在调用http://localhost:8080并获取index.html文件(可能不会通过控制器)。

Spring版本为1.3.6-RELEASE

build.gradle的一部分:

buildscript {
    repositories {
        maven {
            url "http://jcenter.bintray.com"
        }
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:1.3.6.RELEASE")
    }
}

dependencies {
        compile("org.springframework.boot:spring-boot-starter-thymeleaf")
        compile("org.springframework.boot:spring-boot-devtools")
        compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.6.2'
        compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.6.2'
        compile group: 'org.bouncycastle', name: 'bcprov-jdk16', version: '1.46'
        testCompile("junit:junit")
}

4 个答案:

答案 0 :(得分:0)

您的过滤地图/*因此您对索引的调用应为http://localhost:8080/index 你怎么称索引?

答案 1 :(得分:0)

我猜是tomcat的DefaultServlet接受它,您可以尝试在org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory#addDefaultServlet添加断点,然后在org.apache.catalina.servlets.DefaultServlet#doGet添加断点。

答案 2 :(得分:0)

所有类(包括控制器和过滤器)都应该位于包含Application.class文件的包下一层的包中。

答案 3 :(得分:0)

@Order(1000) -> 会为你完成工作

@Component
@Slf4j
@Order(1000)
public class `Class` implement Filter { } `enter code here`