本文将直接使用@WebFilter和@WebListener的方式,完成一个Filter 和一个 Listener。
过滤器(Filter)和 监听器(Listener)的注册方法和 Servlet 一样,不清楚的可以查看下这篇文章:【Spring Boot】 Servlet
SpringBoot之过滤器、监听器
1、工程预览:
先来一张maven结构工程图:
2、创建工程:
1)、创建一个maven项目,配置好pom.xml文件
1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 2 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 3 <modelVersion>4.0.0</modelVersion> 4 <groupId>com.mmzs</groupId> 5 <artifactId>springBoot04</artifactId> 6 <packaging>war</packaging> 7 <version>0.0.1-SNAPSHOT</version> 8 <name>springBoot04 Maven Webapp</name> 9 <url>http://maven.apache.org</url> 10 11 <parent> 12 <groupId>org.springframework.boot</groupId> 13 <!-- 一定要有spring-boot-starter-parent,其中包含了spring的各种插件版本号 --> 14 <artifactId>spring-boot-starter-parent</artifactId> 15 <version>1.5.2.RELEASE</version> 16 <relativePath /><!-- lookup parent from repository --> 17 </parent> 18 19 <!-- 父类统一管理版本信息 --> 20 <properties> 21 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 22 <!-- springboot 默认java版本是1.6,这里显示给它指定为1.8 --> 23 <java.version>1.7</java.version> 24 </properties> 25 26 <dependencies> 27 <!-- 导入单元测试包 --> 28 <dependency> 29 <groupId>junit</groupId> 30 <artifactId>junit</artifactId> 31 <version>3.8.1</version> 32 <scope>test</scope> 33 </dependency> 34 35 <!-- 导入spring boot的web支持,可以不写版本号,在spring-boot-starter-parent已经包含 --> 36 <dependency> 37 <groupId>org.springframework.boot</groupId> 38 <artifactId>spring-boot-starter-web</artifactId> 39 </dependency> 40 </dependencies> 41 <build> 42 <finalName>springBoot04</finalName> 43 <!-- 添加Spring boot的maven插件,可以不写版本号,在spring-boot-starter-parent已经包含 --> 44 <plugin> 45 <groupId>org.springframework.boot</groupId> 46 <artifactId>spring-boot-maven-plugin</artifactId> 47 </plugin> 48 </build> 49 </project>
2)、过滤器(Filter)文件
1 /** 2 * 3 */ 4 package com.mmzs.springboot.filter; 5 6 import java.io.IOException; 7 import javax.servlet.Filter; 8 import javax.servlet.FilterChain; 9 import javax.servlet.FilterConfig; 10 import javax.servlet.ServletException; 11 import javax.servlet.ServletRequest; 12 import javax.servlet.ServletResponse; 13 import javax.servlet.annotation.WebFilter; 14 15 /** 16 * 使用注解标注过滤器 17 * 18 * @author: mmzs 19 * @date: 2018年4月23日 10:11:33 20 * @WebFilter将一个实现了javax.servlet.Filter接口的类定义为过滤器 属性filterName声明过滤器的名称, 可选 21 * 属性urlPatterns指定要过滤 的URL模式,也可使用属性value来声明.(指定要过滤的URL模式是必选属性) 22 * springboot注解详解:http://www.cnblogs.com/mmzs/p/8874349.html 23 * @version V1.0 24 */ 25 @WebFilter(filterName = "myFilter", urlPatterns = "/*") 26 public class MyFilter implements Filter { 27 28 @Override 29 public void destroy() { 30 System.out.println("过滤器销毁"); 31 } 32 33 @Override 34 public void doFilter(ServletRequest request, ServletResponse response, 35 FilterChain chain) throws IOException, ServletException { 36 System.out.println("执行过滤操作"); 37 chain.doFilter(request, response); 38 System.out.println("过滤执行之后的操作"); 39 } 40 41 @Override 42 public void init(FilterConfig config) throws ServletException { 43 System.out.println("过滤器初始化"); 44 } 45 46 }
3)、ServletContext监听器(Listener)文件
1 /** 2 * 3 */ 4 package com.mmzs.springboot.listener; 5 6 import javax.servlet.ServletContextEvent; 7 import javax.servlet.ServletContextListener; 8 import javax.servlet.annotation.WebListener; 9 10 /** 11 * @author: mmzs 12 * @date: 2018年4月19日 13 * @Description: 使用@WebListener注解,实现ServletContextListener接口 14 * springboot注解详解:http://www.cnblogs.com/mmzs/p/8874349.html 15 * @version V1.0 16 */ 17 @WebListener 18 public class MyServletContextListener implements ServletContextListener { 19 20 @Override 21 public void contextInitialized(ServletContextEvent sce) { 22 System.out.println("ServletContex初始化"); 23 System.out.println(sce.getServletContext().getServerInfo()); 24 } 25 26 @Override 27 public void contextDestroyed(ServletContextEvent sce) { 28 System.out.println("ServletContex销毁"); 29 } 30 31 }
4)、HttpSession 监听器(Listener)文件
1 /** 2 * 3 */ 4 package com.mmzs.springboot.listener; 5 6 import javax.servlet.annotation.WebListener; 7 import javax.servlet.http.HttpSessionEvent; 8 import javax.servlet.http.HttpSessionListener; 9 10 /** 11 * @author: mmzs 12 * @date: 2018年4月19日 13 * @Description: 监听Session的创建与销毁 14 * springboot注解详解:http://www.cnblogs.com/mmzs/p/8874349.html 15 * @version V1.0 16 */ 17 @WebListener 18 public class MyHttpSessionListener implements HttpSessionListener { 19 20 @Override 21 public void sessionCreated(HttpSessionEvent se) { 22 System.out.println("Session 被创建"); 23 } 24 25 @Override 26 public void sessionDestroyed(HttpSessionEvent se) { 27 System.out.println("Session 被销毁"); 28 } 29 30 }
5)、Controller
1 package com.mmzs.springboot; 2 3 import java.util.ArrayList; 4 import java.util.HashMap; 5 import java.util.List; 6 import java.util.Map; 7 8 import javax.servlet.http.HttpServletRequest; 9 import javax.servlet.http.HttpSession; 10 11 import org.springframework.boot.autoconfigure.EnableAutoConfiguration; 12 import org.springframework.web.bind.annotation.RequestMapping; 13 import org.springframework.web.bind.annotation.RequestParam; 14 import org.springframework.web.bind.annotation.RestController; 15 16 /** 17 * Created by mmzs 2018年4月2日 11:50:57 18 * springboot注解详解:http://www.cnblogs.com/mmzs/p/8874349.html 19 */ 20 //用于标注控制层组件(如struts中的action),@ResponseBody和@Controller的合集, 21 //这样子获取的数据返回前台时也会自动转发为json格式。 22 @RestController 23 //Spring Boot自动配置(auto-configuration):尝试根据你添加的jar依赖自动配置你的Spring应用。 24 @EnableAutoConfiguration 25 public class HelloController { 26 27 @RequestMapping("/hello") 28 public String hello(HttpServletRequest request) { 29 HttpSession session = request.getSession(); 30 return "Hello Spring-Boot"; 31 } 32 33 } 34
6)、启动入口类
1 package com.mmzs.springboot; 2 3 import org.springframework.boot.SpringApplication; 4 import org.springframework.boot.autoconfigure.SpringBootApplication; 5 import org.springframework.boot.web.servlet.ServletComponentScan; 6 7 /** 8 * 基于配置的servlet配置 9 * Created by mmzs 2018年4月9日 11:43:59 10 */ 11 @SpringBootApplication 12 //在 SpringBootApplication 上使用@ServletComponentScan 注解后, 13 //Servlet、Filter、Listener 可以直接通过 @WebServlet、@WebFilter、@WebListener 注解自动注册,无需其他代码 14 @ServletComponentScan 15 public class SpringBootSampleApplication { 16 17 public static void main(String[] args) { 18 SpringApplication.run(SpringBootSampleApplication.class, args); 19 } 20 }
注意:不要忘记在 SpringBootSampleApplication.java 上添加 @ServletComponentScan注解。
3、访问测试:
1)、服务启动过程中会看到:
ServletContex初始化 Apache Tomcat/8.5.11 过滤器初始化
2)、服务启动后,随便访问一个页面会看到:
执行过滤操作
Session 被创建
过滤执行之后的操作
4、小结
有人说没有“Session被创建”,因为你还没有用到session,在你访问的那个Controller中加入:
@RequestMapping public String hello(HttpServletRequest request) { HttpSession session = request.getSession(); return "Hello Spring-Boot"; }
至于如何使用代码的方式注册Filter和Listener,请参考这篇文章:【Spring Boot】 Servlet的介绍。不同的是需要使用 FilterRegistrationBean 和 ServletListenerRegistrationBean 这两个类。
注意:
当你运行SpringBootSampleApplication的时候,spring boot只扫描当前包下及其子包下的注解,所以建议SpringBootSampleApplication放在需要扫描包的上一层或顶层。
5、参考文章
【Spring Boot 四】过滤器、监听器:https://www.27wy.cn/archives/362
该作者SpringBoot专题:点这里