Servlet
的组件包括Filter
, Listener
, Servlet
, 具体详情可参考Servlet详解.
普通的web项目都是从web.xml
中配置, Spring boot
中为我们提供了很多注册的方式. 我们先以Filter
举例, 然后再介绍Listener
和Servlet
的注册, 他们的注册方式基本一致.
直接作为一个Bean
注册.
自定义Filter
通常可以实现Filter
接口, 或者可以继承Spring
提供的GenericFilterBean
.
当Spring Boot
监测到有javax.servlet.Filter
的bean
时就会自动加入过滤器调用链.
代码如下:
@Component
public class MyFilter extends GenericFilterBean {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// some code
}
}
通过FilterRegistrationBean
注册, 这个类实现了ServletContextInitializer
接口
比如还是注册上面写的那个MyFilter
, 注册及配置的代码如下:
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {
@Bean
public FilterRegistrationBean registMyFilter() {
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
registrationBean.setFilter(new MyFilter());
registrationBean.setName("myFilter");
registrationBean.setUrlPatterns(Sets.newHashSet("/*"));
registrationBean.setOrder(1);
return registrationBean;
}
}
使用@ServletComponentScan
扫描@WebFilter
注解自动注册
这种方式需要在 主配置类 上加@ServletComponentScan
注解, 在我们的MyFilter
类上加@WebFilter
注解. 代码如下:
// 主配置类
@SpringBootApplication
@ServletComponentScan
public class Application {
// ...
}
// 自定义的过滤器类
@WebFilter(filterName = "myFilter", urlPatterns = "/*")
public class MyFilter extends GenericFilterBean {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// some code
}
}
Listener
的注册方式跟Filter
一样, 只是继承或实现的接口, 添加的注解不一样.
ServletContextListener
接口ServletListenerRegistrationBean
注册@WebServlet
注解注册.在Spring
项目中, 都是通过DispatcherServlet
分发, 基本不需要自定义Servlet
. 下面仅介绍使用方式
ServletRegistrationBean
注册@WebServlet(name = "myServlet", urlPatterns = "/abc/*")
注解注册.