本文将直接使用@WebFilter和@WebListener的方式,完成一个Filter 和一个 Listener。
过滤器(Filter)和 监听器(Listener)的注册方法和 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>
pom.xml
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注解详解:
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 }
MyFilter
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注解详解:
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 }
MyServletContextListener
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注解详解:
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 }
MyHttpSessionListener
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注解详解:
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
HelloController
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 }
main
注意:不要忘记在 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,不同的是需要使用 FilterRegistrationBean 和 ServletListenerRegistrationBean 这两个类。
注意:
当你运行SpringBootSampleApplication的时候,spring boot只扫描当前包下及其子包下的注解,所以建议SpringBootSampleApplication放在需要扫描包的上一层或顶层。