一 整合过滤器
在SpringBoot项目中要实现自己的过滤器很简单 只需要如下几步即可
-
集成starter-web依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
-
实现Filter接口
//@Order(1) @Order注解并不能控制filter的执行顺序 它只能决定spring容器装载bean的一个顺序 如果你需要对filter的执行顺序 //做控制 建议使用 FilterRegistration @WebFilter(filterName = "MyFilter", urlPatterns = "/*") public class MyFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("过滤器初始化"); Filter.super.init(filterConfig); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("进行过滤处理"); chain.doFilter(request, response); } @Override public void destroy() { Filter.super.destroy(); System.out.println("销毁过滤器"); } }
-
在启动类上添加@ServletComponentScan注解
//@ServletComponentScan 默认会扫描当前类(启动类)所在包及其子包下的所有的servlet相关注解 @ServletComponentScan @SpringBootApplication public class SpringbootDemo1Application { public static void main(String[] args) { SpringApplication.run(SpringbootDemo1Application.class, args); } }
-
使用FilterRegistrationBean注册filter
如果基于注解方式不够灵活 也可以通过ServletRegistrationBean、FilterRegistrationBean、以及ServletListenerRegistrationBean类来将Servlet、Filter和Listener来注册为spring的bean 同样也可以达到上面的效果。这里演示如何利用FilterRegistration类来实现filter//过滤器一 不需要加任何的注解 public class MyFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("过滤器初始化1"); Filter.super.init(filterConfig); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("进行过滤处理1"); chain.doFilter(request, response); } @Override public void destroy() { Filter.super.destroy(); System.out.println("销毁过滤器1"); } } //过滤器二 不需要加任何的注解 public class MyFilter2 implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { Filter.super.init(filterConfig); System.out.println("过滤器初始化2"); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("进行过滤处理2"); chain.doFilter(request, response); } @Override public void destroy() { Filter.super.destroy(); System.out.println("销毁过滤器2"); } } //启动类也不需要加@ServletComponentScan注解进行扫描 @SpringBootApplication public class SpringbootDemo1Application { public static void main(String[] args) { SpringApplication.run(SpringbootDemo1Application.class, args); } } //新增一个配置类 @Configuration public class FilterConfig { //利用FilterRegistrationBean将filter装配为一个bean 并且通过setOrder方法去控制filter的执行顺序 @Bean public FilterRegistrationBean filterRegistration() { FilterRegistrationBean<MyFilter> registration = new FilterRegistrationBean<>(); registration.setFilter(new MyFilter()); registration.addUrlPatterns("/*"); registration.setOrder(1); //过滤器的执行顺序 registration.setName("MyFilter"); return registration; } @Bean public FilterRegistrationBean filterRegistration2() { FilterRegistrationBean<MyFilter2> registration = new FilterRegistrationBean<>(); registration.setFilter(new MyFilter2()); registration.addUrlPatterns("/*"); registration.setOrder(2); //过滤器的执行顺序 registration.setName("MyFilter2"); return registration; } }
二 集成监听器
listener是servlet规范定义的一种特殊类,用于监听servletContext、HttpSession和servletRequest等域对象的创建和销毁事件。监听域对象的属性发生修改的事件,用于在事件发生前、发生后做一些必要的处理。可用于以下方面1、统计在线人数和在线用户 2、系统启动时加载初始化信息3、统计网站访问量4、记录用户访问路径
-
利用@WebListener注解创建监听器
//监听器需要自己去实现相应的listener接口 @WebListener注解 需要与@ServletComponentScan注解配合使用 //listener才会生效 @WebListener public class MySessionListener implements HttpSessionListener { @Override public void sessionCreated(HttpSessionEvent se) { System.out.println("创建session"); } @Override public void sessionDestroyed(HttpSessionEvent se) { System.out.println("销毁session"); } } //启动类 加上@ServletComponentScan注解 @ServletComponentScan @SpringBootApplication public class SpringbootDemo1Application { public static void main(String[] args) { SpringApplication.run(SpringbootDemo1Application.class, args); } } //测试类 需要通过request.getSession()触发HttpSessionListener监听的事件 @RestController public class TestController { @RequestMapping(path = "/hello", method = RequestMethod.GET) public String hello(HttpServletRequest request) { request.getSession(); //触发session的创建 return "hello"; } }
-
利用ServletListenerRegistrationBean创建listener
ServletListenerRegistrationBean创建listener 可以对listener进行一些细粒度的控制 如listener的执行顺序等//不需要加任何的注解 启动类上也不需要加@ServletComponentScan注解 public class MySessionListener implements HttpSessionListener { @Override public void sessionCreated(HttpSessionEvent se) { System.out.println("创建session"); } @Override public void sessionDestroyed(HttpSessionEvent se) { System.out.println("销毁session"); } } @Configuration public class ListenerConfig { //通过ServletListenerRegistrationBean的方式将listener注入到spring容器中 @Bean public ServletListenerRegistrationBean<MySessionListener> listenerRegistrationBean() { ServletListenerRegistrationBean<MySessionListener> registrationBean = new ServletListenerRegistrationBean<>(); registrationBean.setListener(new MySessionListener()); registrationBean.setOrder(1); //设置监听器的执行顺序 return registrationBean; } } //测试类 @RestController public class TestController { @RequestMapping(path = "/hello", method = RequestMethod.GET) public String hello(HttpServletRequest request) { request.getSession(); //触发session的创建 return "hello"; } } //启动类 @SpringBootApplication public class SpringbootDemo1Application { public static void main(String[] args) { SpringApplication.run(SpringbootDemo1Application.class, args); } }
三 静态资源的配置
默认情况下,SpringBoot将在classpath或者ServletContext根目录下从名为/static(/pulic、/resources、或/META-INF/resources)目录中加载静态资源。它使用了SpringMVC的ResourceHttpRequestHandler,因此也可以通过实现WebMvcConfigurer接口重写addResourceHandlers方法来自己自定义springboot中的静态资源目录
示例
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//过滤swagger 如果访问的uri是swagger-ui.html 将会映射到classpath:/META-INF/resources/这个目录下去找对应的静态资源
registry.addResourceHandler("swagger-ui.html")
.addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/");
registry.addResourceHandler("/swagger-resources/**")
.addResourceLocations("classpath:/META-INF/resources/swagger-resources/");
registry.addResourceHandler("/swagger/**")
.addResourceLocations("classpath:/META-INF/resources/swagger*");
registry.addResourceHandler("/v2/api-docs/**")
.addResourceLocations("classpath:/META-INF/resources/v2/api-docs/");
}
}