• SpringBoot学习(八)-->SpringBoot之过滤器、监听器


    本文将直接使用@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>
    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注解详解: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 }
    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注解详解: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 }
    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注解详解: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 }
    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注解详解: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  
    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,请参考这篇文章:【Spring Boot】 Servlet的介绍。不同的是需要使用 FilterRegistrationBean 和 ServletListenerRegistrationBean 这两个类。 

    注意:

    当你运行SpringBootSampleApplication的时候,spring boot只扫描当前包下及其子包下的注解,所以建议SpringBootSampleApplication放在需要扫描包的上一层或顶层。

    5、参考文章

    【Spring Boot 四】过滤器、监听器:https://www.27wy.cn/archives/362

    该作者SpringBoot专题:点这里

  • 相关阅读:
    if控制器+循环控制器+计数器,控制接口分支
    前置处理器
    逻辑控制器
    配置元件
    基础元件
    docker etcdctl报错:etcdctl No help topic for 'put'
    celery定时执行ansible api返回为空的问题
    Ansible+Jenkins+Gitlab搭建及配置
    进击的Python【第十六章】:Web前端基础之jQuery
    进击的Python【第十五章】:Web前端基础之DOM
  • 原文地址:https://www.cnblogs.com/mmzs/p/9267278.html
Copyright © 2020-2023  润新知