1 配置了指定请求路径的过滤器,但却过滤的所有请求
1.1 问题复现
- 示例代码
@Component
@WebFilter(urlPatterns = {"/api/test/*"})
public class MyFilter implements Filter {
}
这段代码看着好像是只对/api/test/
下的所有请求进行过滤,但实际上却过滤了所有请求。
1.2 问题原因
在过滤器上加上@Component
注解之后,过滤器就默认对所有请求进行过滤操作了。
1.3 问题解决
1.3.1 只对部分路径过滤
如果只是想对指定的路径进行过滤,只需要配置@WebFilter(urlPatterns = {"/api/test/*"})
即可,不需要再加@Component
注解。
- 示例代码:
// 此处无需加 @Component 注解
@WebFilter(urlPatterns = {"/api/test/*"})
public class MyFilter implements Filter {
}
// 在启动类上需要加上 @ServletComponentScan 注解,否则过滤器不生效
@ServletComponentScan
public class TestApplication {
}
这样,MyFilter
就只会过滤符合规则/api/test/*
的请求了。
1.3.2 对全局进行过滤
通过上面描述可以知道,如果想对全局请求进行顾虑,只需要在过滤器类上加上@Component
注解即可。
2 配置了过滤器但是不生效,未对指定的请求路径进行过滤
2.1 问题复现
- 示例代码
@WebFilter(urlPatterns = {"/api/test"})
public class MyFilter implements Filter {
}
当时以为这样写就可以过滤以/api/test
开头的请求,结果太天真,这样的配置是精确匹配,智能过滤到http://host:port/api/test
的请求,如果请求是http://host:port/api/test/user
就不会进行过滤了。
如果是想过滤/api/test
下的所有路径,需要这样配置:
@WebFilter(urlPatterns = {"/api/test/*"})
public class MyFilter implements Filter {
}
3 关于server.servlet.context-path
如果项目中配置了server.servlet.context-path
属性,假如是这样配置的:
server.
servlet.
context-path: context
如果请求/api/test/user
接口,实际请求url是这样的http://host:port/context/api/test/user
,但是如果我们这样配置过滤器,过滤器是不生效的:
@WebFilter(urlPatterns = {"/context/api/test/*"})
public class MyFilter implements Filter {
}
所以要注意,如果配置了server.servlet.context-path
,过滤器要配置项目的接口路径,而不应该加上server.servlet.context-path
的属性