本文将直接使用@WebFilter和@WebListener的方式,完成一个Filter 和一个 Listener。

过滤器(Filter)和 监听器(Listener)的注册方法和 Servlet 一样,不清楚的可以查看下这篇文章:【Spring Boot】 Servlet

SpringBoot之过滤器、监听器

1、工程预览:

先来一张maven结构工程图:

2、创建工程:

1)、创建一个maven项目,配置好pom.xml文件

 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mmzs</groupId>
<artifactId>springBoot04</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>springBoot04 Maven Webapp</name>
<url>http://maven.apache.org</url> <parent>
<groupId>org.springframework.boot</groupId>
<!-- 一定要有spring-boot-starter-parent,其中包含了spring的各种插件版本号 -->
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.2.RELEASE</version>
<relativePath /><!-- lookup parent from repository -->
</parent> <!-- 父类统一管理版本信息 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- springboot 默认java版本是1.6,这里显示给它指定为1.8 -->
<java.version>1.7</java.version>
</properties> <dependencies>
<!-- 导入单元测试包 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency> <!-- 导入spring boot的web支持,可以不写版本号,在spring-boot-starter-parent已经包含 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<finalName>springBoot04</finalName>
<!-- 添加Spring boot的maven插件,可以不写版本号,在spring-boot-starter-parent已经包含 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</build>
</project>

pom.xml

2)、过滤器(Filter)文件

 /**
*
*/
package com.mmzs.springboot.filter; import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter; /**
* 使用注解标注过滤器
*
* @author: mmzs
* @date: 2018年4月23日 10:11:33
* @WebFilter将一个实现了javax.servlet.Filter接口的类定义为过滤器 属性filterName声明过滤器的名称, 可选
* 属性urlPatterns指定要过滤 的URL模式,也可使用属性value来声明.(指定要过滤的URL模式是必选属性)
* springboot注解详解:http://www.cnblogs.com/mmzs/p/8874349.html
* @version V1.0
*/
@WebFilter(filterName = "myFilter", urlPatterns = "/*")
public class MyFilter implements Filter { @Override
public void destroy() {
System.out.println("过滤器销毁");
} @Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println("执行过滤操作");
chain.doFilter(request, response);
System.out.println("过滤执行之后的操作");
} @Override
public void init(FilterConfig config) throws ServletException {
System.out.println("过滤器初始化");
} }

MyFilter

3)、ServletContext监听器(Listener)文件

 /**
*
*/
package com.mmzs.springboot.listener; import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener; /**
* @author: mmzs
* @date: 2018年4月19日
* @Description: 使用@WebListener注解,实现ServletContextListener接口
* springboot注解详解:http://www.cnblogs.com/mmzs/p/8874349.html
* @version V1.0
*/
@WebListener
public class MyServletContextListener implements ServletContextListener { @Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("ServletContex初始化");
System.out.println(sce.getServletContext().getServerInfo());
} @Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContex销毁");
} }

MyServletContextListener

4)、HttpSession 监听器(Listener)文件

 /**
*
*/
package com.mmzs.springboot.listener; import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener; /**
* @author: mmzs
* @date: 2018年4月19日
* @Description: 监听Session的创建与销毁
* springboot注解详解:http://www.cnblogs.com/mmzs/p/8874349.html
* @version V1.0
*/
@WebListener
public class MyHttpSessionListener implements HttpSessionListener { @Override
public void sessionCreated(HttpSessionEvent se) {
System.out.println("Session 被创建");
} @Override
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("Session 被销毁");
} }

MyHttpSessionListener

5)、Controller

 package com.mmzs.springboot;

 import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession; import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; /**
* Created by mmzs 2018年4月2日 11:50:57
* springboot注解详解:http://www.cnblogs.com/mmzs/p/8874349.html
*/
//用于标注控制层组件(如struts中的action),@ResponseBody和@Controller的合集,
//这样子获取的数据返回前台时也会自动转发为json格式。
@RestController
//Spring Boot自动配置(auto-configuration):尝试根据你添加的jar依赖自动配置你的Spring应用。
@EnableAutoConfiguration
public class HelloController { @RequestMapping("/hello")
public String hello(HttpServletRequest request) {
HttpSession session = request.getSession();
return "Hello Spring-Boot";
} }

HelloController

6)、启动入口类

 package com.mmzs.springboot;

 import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan; /**
* 基于配置的servlet配置
* Created by mmzs 2018年4月9日 11:43:59
*/
@SpringBootApplication
//在 SpringBootApplication 上使用@ServletComponentScan 注解后,
//Servlet、Filter、Listener 可以直接通过 @WebServlet、@WebFilter、@WebListener 注解自动注册,无需其他代码
@ServletComponentScan
public class SpringBootSampleApplication { public static void main(String[] args) {
SpringApplication.run(SpringBootSampleApplication.class, args);
}
}

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专题:点这里

SpringBoot学习(八)-->SpringBoot之过滤器、监听器的更多相关文章

  1. Spring boot 学习八 Springboot的filter

    一:  传统的javaEE增加Filter是在web.xml中配置,如以下代码: <filter> <filter-name>TestFilter</filter-nam ...

  2. SpringBoot学习之SpringBoot执行器

    在以往的分布式开发当中,各个服务节点的监控必不可少.监控包含有很多方面,比如说:内存占用情况,节点是否健康等.在spring-boot会给我们提供相关资源监控叫做spring-boot-actuato ...

  3. SpringBoot学习(七)-->SpringBoot在web开发中的配置

    SpringBoot在web开发中的配置 Web开发的自动配置类:在Maven Dependencies-->spring-boot-1.5.2.RELEASE.jar-->org.spr ...

  4. SpringBoot学习(六)-->SpringBoot的自动配置的原理

    Spring Boot的自动配置的原理 Spring Boot在进行SpringApplication对象实例化时会加载META-INF/spring.factories文件,将该配置文件中的配置载入 ...

  5. SpringBoot学习(五)-->SpringBoot的核心

    SpringBoot的核心 1.入口类和@SpringBootApplication Spring Boot的项目一般都会有*Application的入口类,入口类中会有main方法,这是一个标准的J ...

  6. SpringBoot学习(四)-->SpringBoot快速入门,开山篇

    Spring Boot简介 Spring Boot的目的在于创建和启动新的基于Spring框架的项目.Spring Boot会选择最适合的Spring子项目和第三方开源库进行整合.大部分Spring ...

  7. SpringBoot学习<二>——SpringBoot的默认配置文件application和多环境配置

    一.SpringBoot的默认文件appliction 上一篇文章已经说明,springboot启动会内嵌tomcat,端口也是默认的8080,如果我们想要改变端口如果做呢? 在springboot项 ...

  8. SpringBoot学习(一):SpringBoot入门

    1.Spring Boot 简介 1) 简化Spring应用开发的一个框架: 2) 整个Spring技术栈的一个大整合: 3) J2EE开发的一站式解决方案: 2.微服务 2014,martin fo ...

  9. SpringBoot学习- 5、整合Redis

    SpringBoot学习足迹 SpringBoot项目中访问Redis主要有两种方式:JedisPool和RedisTemplate,本文使用JedisPool 1.pom.xml添加dependen ...

随机推荐

  1. 计算机网络六:无线局域网、IEEE 802.11、WIFI和蓝牙

    无线局域网.IEEE 802.11.WIFI和蓝牙 ㈠无线局域网 1.定义       无线局域网络(Wireless Local Area Networks),简称WLAN.它是相当便利的数据传输系 ...

  2. centos jdk 配置及版本切换

    一. 环境变量: /etc/profile JAVA_HOME=/usr/lib/jdk1.8.0_91JRE_HOME=/usr/lib/jdk1.8.0_91/jreCLASS_PATH=.:$J ...

  3. Shell变量类型和运算符-2

  4. Python之旅Day12 HTML与CSS

    前端CSS与HTML部分 <a href="http://www.baidu.com" target="_Blank">百度</a>_B ...

  5. arp脚本

    1.什么是arp?arp可以解决什么问题? ARP:是地址解析协议 arp解决我们知道一个机器(主机或者路由器)的IP地址,需要找出其相应的硬件地址 2.编写ARP脚本,抓取对应主机的mac地址 1 ...

  6. Python 列表详细使用

    1. 列表 列表是Python中内置有序.可变序列,列表的所有元素放在一对中括号“[]”中,并使用逗号分隔开: 当列表元素增加或删除时,列表对象自动进行扩展或收缩内存,保证元素之间没有缝隙: 在Pyt ...

  7. 小白必读:闲话HTTP短连接中的Session和Token

    本文引用了刘欣的文章,感谢原作者的分享. 1.引言 Http协议在现今主流的IM系统中拥有无可替代的重要性(在IM系统中用HTTP发起的连接被大家简称为http短连接),但Http作为传统互联网信息交 ...

  8. 4 年前端狗,2 年 CTO

    阅读本文大概需要 14 分钟. 本文系作者:『Scott』原创发布于慕课网. 我,Scott,一家创业公司的 CTO. 从业6年却很少写文章,近一年来接触了几十个刚毕业的前端新人,也面试了100多个前 ...

  9. 第74节:Java中的Cookie和Session

    第74节:第74节:Java中的Cookie和Session ServletContext: 什么是ServletContext,有什么用哦,怎么用呢? 启动服务器后,会给每个应用程序创建一个Serv ...

  10. [Postman]查找替换(5)

    在邮差中查找和替换 在Postman中快速轻松地查找和替换API项目中的文本.Postman应用程序使您能够执行全局查找和替换操作,该操作可在其各种组件(如集合,环境,全局和打开选项卡)中无缝工作.这 ...