前言

在 Spring Boot 中已经移除了 web.xml 文件,如果需要注册添加 Servlet、Filter、Listener 为 Spring Bean,在 Spring Boot 中有两种方式:

  • 使用 Servlet 3.0 API 的注解 @WebServlet、@WebFilter、@Listener 用来配置。
  • Spring Boot JavaConfig 注解配置 Bean 的方式来进行配置。

注册之前

在使用 Servlet 时,需要在 Spring Boot 入口类添加 @ServletComponentScan 注解,告诉 Spring Boot 去扫描使用下面注册的 Servlet、Filter、Listener。

@SpringBootApplication
@ServletComponentScan
public class SpringBootServletApplication { public static void main(String[] args) {
SpringApplication.run(SpringBootServletApplication.class, args);
} }

注册 Servlet

1.@WebServlet 属性

属性 类型 描述
name String 指定Servlet名称,等价于
value String[] 等同于 urlPatterns 属性,两者不应该同时使用
urlPatterns String[] 指定一组 Servlet 的 URL 匹配模式。等价于标签
loadOnStartup int 指定 Servlet 的加载顺序,等价于 标签
initParams WebInitParam[] 指定一组 Servlet 初始化参数,等价于标签
asyncSupported boolean 声明 Servlet 是否支持异步操作模式,等价于 标签
smallIcon String 此 Servlet 的小图标
largeIcon String 此 Servlet 的大图标
description String 该 Servlet 的描述信息,等价于 标签
displayName String 该 Servlet 的显示名,通常配合工具使用,等价于 标签

2.示例

@WebServlet(urlPatterns = "/TestServlet")
public class TestServlet extends HttpServlet { /**
*
*/
private static final long serialVersionUID = -3325041776508043481L; @Override
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
doPost(req, resp);
}
/*
* 实现请求uri和header打印,另外返回一个json
*/
@Override
public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
System.out.println("RequestURI:" + req.getRequestURI()); System.out.println("Request Headers:"); StringBuilder sb = new StringBuilder();
Enumeration<?> names = req.getHeaderNames();
while (names.hasMoreElements()) {
String name = names.nextElement().toString();
Enumeration<?> hs = req.getHeaders(name);
sb.append(name).append(":");
while (hs.hasMoreElements()) {
sb.append(hs.nextElement()).append(";");
}
}
System.out.println(sb); ObjectMapper om=new ObjectMapper();
UserEntity user=new UserEntity();
user.setId(1L);
user.setUserName("zwqh");
user.setUserSex("男");
user.setHeaders(sb.toString());
String resultJson=om.writeValueAsString(user); resp.setContentType("application/json;charset=UTF-8"); resp.getWriter().print(resultJson);
} }

其中@WebServlet(urlPatterns = "/TestServlet")等价于以下代码:

<servlet>
<!-- 类名 -->
<servlet-name> TestServlet </servlet-name>
<!-- 所在的包 -->
<servlet-class> cn.zwqh.springbboot.servlet.TestServlet </servlet-class>
</servlet>
<servlet-mapping>
<servlet-name> TestServlet </servlet-name>
<!-- 访问的url路径地址 -->
<url-pattern> /TestServlet </url-pattern>
</servlet-mapping>

3.测试

浏览器访问 http://127.0.0.1:8080/TestServlet



日志输出:

注册 Filter

1.@WebFilter 属性

属性 类型 描述
filterName String 指定Filter名称,等价于
value String[] 等同于 urlPatterns 属性,两者不应该同时使用
urlPatterns String[] 指定一组 Filter 的 URL 匹配模式。等价于标签
servletNames String[] 指定过滤器将应用于哪些 Servlet。取值于 @WebServlet 中的 name 属性,或者是 web.xml 中 的值
initParams WebInitParam[] 指定一组 Filter 初始化参数,等价于标签
dispatcherTypes DispatcherType[] 指定 Filter 的转发模式,包括:ASYNC、ERROR、FORWARD、INCLUDE、REQUEST
asyncSupported boolean 声明 Filter 是否支持异步操作模式,等价于 标签
smallIcon String 此 Filter 的小图标
largeIcon String 此 Filter 的大图标
description String 该 Filter 的描述信息,等价于 标签
displayName String 该 Filter 的显示名,通常配合工具使用,等价于 标签

2.示例

@WebFilter(urlPatterns = { "/TestServlet" }) // 注册拦截器,并添加拦截路径‘/TestServlet’
public class TestFilter implements Filter { /**
* 初始化,只在项目启动的时候执行一次
*/
@Override
public void init(FilterConfig filterConfig) {
System.out.println("===> TestFilter init");
}
/**
* 用于存放过滤器的业务逻辑实现代码
*/
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException { chain.doFilter(request, response);// 处理请求和响应的分界线
System.out.println("===> chain.doFilter 后执行处理 response 的相关方法");
// 在response header里设置一个token
setToken(response); } private void setToken(ServletResponse response) {
HttpServletResponse res = (HttpServletResponse) response;
String token = UUID.randomUUID().toString();
res.setHeader("Token", token);
System.out.println("===> 设置了token:" + token);
} /**
* 销毁,在项目关闭,Servlet 容器销毁前调用
*/
@Override
public void destroy() {
System.out.println("===> TestFilter destroy");
} }

3.测试

浏览器访问 http://127.0.0.1:8080/TestServlet



日志打印:

4.Filter 主要使用场景

  • 禁用浏览器的缓存(缓存的处理)
  • 解决中文乱码问题
  • 登录鉴权及权限管理
  • 用户授权,负责检查用户的请求,根据请求过滤用户非法请求
  • 日志记录,详细记录某些特殊的用户请求
  • 其他场景

注册 Listener

1.@Listener 属性

属性 类型 描述
value String 侦听器Listener的描述

2.示例

与 ServletContext 相关的监听

Servlet 的监听器 Listener 是实现了 javax.servlet.ServletContextListener 接口的服务器端程序,随着 Web 应用启动而启动,只初始化一次,也随着 Web 应用停止而销毁。其主要作用是做一些初始化的内容添加工作,如参数和对象等。

@WebListener
public class ContextListener implements ServletContextListener, ServletContextAttributeListener{ public static final String INITIAL_CONTENT = "Content created in servlet Context"; /**
* ServletContext创建
*/
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("===> context initialized");
ServletContext servletContext = sce.getServletContext();
servletContext.setAttribute("content", INITIAL_CONTENT);
} /**
* ServletContext销毁
*/
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("===> context destroyed");
} /**
* context属性新增
*/
@Override
public void attributeAdded(ServletContextAttributeEvent scae) {
System.out.println("===> context attribute added");
} /**
* context属性移除
*/
@Override
public void attributeRemoved(ServletContextAttributeEvent scae) {
System.out.println("===> context attribute removed");
} /**
* context属性替换
*/
@Override
public void attributeReplaced(ServletContextAttributeEvent scae) {
System.out.println("===> context attribute replaced");
}
}
与 HttpSession 相关的监听
@WebListener
public class SessionListener implements HttpSessionListener, HttpSessionIdListener, HttpSessionAttributeListener,
HttpSessionActivationListener { /**
* session被创建时
*/
@Override
public void sessionCreated(HttpSessionEvent se) {
System.out.println("===> session created");
} /**
* session被销毁时
*/
@Override
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("===> session destroyed");
} /**
* sessionId改变
*/
@Override
public void sessionIdChanged(HttpSessionEvent se, String oldSessionId) {
System.out.println("===> session id changed");
} /**
* session属性新增
*/
@Override
public void attributeAdded(HttpSessionBindingEvent se) {
System.out.println("===> session attribute added");
} /**
* session属性移除
*/
@Override
public void attributeRemoved(HttpSessionBindingEvent se) {
System.out.println("===> session attribute removed");
} /**
* session属性替换
*/
@Override
public void attributeReplaced(HttpSessionBindingEvent se) {
System.out.println("===> session attribute replaced");
}
/**
* session的钝化,内存的数据写入到硬盘上的过程。
*/
@Override
public void sessionWillPassivate(HttpSessionEvent se) {
System.out.println("===> session will passivate");
}
/**
* session的活化,将硬盘的数据恢复到内存中。
*/
@Override
public void sessionDidActivate(HttpSessionEvent se) {
System.out.println("===> session did activate");
} }
与 ServletRequest 相关的监听
@WebListener
public class RequestListener implements ServletRequestListener,ServletRequestAttributeListener {
/**
* 请求即将进入Web应用程序的范围/请求初始化时
*/
@Override
public void requestInitialized(ServletRequestEvent sre) {
System.out.println("===> request initialized");
}
/**
* 请求即将进入Web应用程序的范围/请求销毁时
*/
@Override
public void requestDestroyed(ServletRequestEvent sre) {
System.out.println("===> request destroyed");
}
/**
* request属性新增
*/
@Override
public void attributeAdded(ServletRequestAttributeEvent srae) {
System.out.println("===> request attribute added");
}
/**
* request属性移除
*/
@Override
public void attributeRemoved(ServletRequestAttributeEvent srae) {
System.out.println("===> request attribute removed");
}
/**
* request属性替换
*/
@Override
public void attributeReplaced(ServletRequestAttributeEvent srae) {
System.out.println("===> request attribute replaced");
}
}

3.项目相关日志输入(启动和停止)

先执行 contextInitialzed 方法在执行 TestFilter 类的 init 方法,

contextDestroyed 方法在 TestFilter 类 destroy 方法执行后执行。

示例代码

github

码云

非特殊说明,本文版权归 朝雾轻寒 所有,转载请注明出处.

原文标题:Spring Boot 2.X(十):自定义注册 Servlet、Filter、Listener

原文地址:https://www.zwqh.top/article/info/17

如果文章对您有帮助,请扫码关注下我的公众号,文章持续更新中...

Spring Boot 2.X(十):自定义注册 Servlet、Filter、Listener的更多相关文章

  1. SpringBoot注册Servlet/Filter/Listener

    由于SpringBoot默认是以jar包的方式启动嵌入式的Servlet容器来启动SpringBoot的web应用,那么没有web.xml文件,如何配置我们的三大Web基础组件呢? 通过使用XXXRe ...

  2. Spring Boot 自定义注册 Servlet、Filter、Listener

    前言 在 Spring Boot 中已经移除了 web.xml 文件,如果需要注册添加 Servlet.Filter.Listener 为 Spring Bean,在 Spring Boot 中有两种 ...

  3. Spring Boot 实战:如何自定义 Servlet Filter

    1.前言 有些时候我们需要在 Spring Boot Servlet Web 应用中声明一些自定义的 Servlet Filter来处理一些逻辑.比如简单的权限系统.请求头过滤.防止 XSS 攻击等. ...

  4. spring boot实战(第十二篇)整合RabbitMQ

    前言 最近几篇文章将围绕消息中间件RabbitMQ展开,对于RabbitMQ基本概念这里不阐述,主要讲解RabbitMQ的基本用法.Java客户端API介绍.spring Boot与RabbitMQ整 ...

  5. spring boot 常见三十四问

    Spring Boot 是微服务中最好的 Java 框架. 我们建议你能够成为一名 Spring Boot 的专家. 问题一 Spring Boot.Spring MVC 和 Spring 有什么区别 ...

  6. Spring Boot 2.X(十六):应用监控之 Spring Boot Actuator 使用及配置

    Actuator 简介 Actuator 是 Spring Boot 提供的对应用系统的自省和监控功能.通过 Actuator,可以使用数据化的指标去度量应用的运行情况,比如查看服务器的磁盘.内存.C ...

  7. Spring Boot 2.X(十八):集成 Spring Security-登录认证和权限控制

    前言 在企业项目开发中,对系统的安全和权限控制往往是必需的,常见的安全框架有 Spring Security.Apache Shiro 等.本文主要简单介绍一下 Spring Security,再通过 ...

  8. spring boot / cloud (二十) 相同服务,发布不同版本,支撑并行的业务需求

    spring boot / cloud (二十) 相同服务,发布不同版本,支撑并行的业务需求 有半年多没有更新了,按照常规剧本,应该会说项目很忙,工作很忙,没空更新,吧啦吧啦,相关的话吧, 但是细想想 ...

  9. spring boot集成swagger,自定义注解,拦截器,xss过滤,异步调用,guava限流,定时任务案例, 发邮件

    本文介绍spring boot集成swagger,自定义注解,拦截器,xss过滤,异步调用,定时任务案例 集成swagger--对于做前后端分离的项目,后端只需要提供接口访问,swagger提供了接口 ...

随机推荐

  1. STM32的RTC中断标志只能手动清除

    背景: 最近在做一个stm32的项目,其中用到RTC的实时时钟功能.时钟源采用外部32.768K晶振,时钟预分频设置为32767,目的是为了产生1秒的中断,然后在中断处理函数中更新实时年月日时分秒. ...

  2. 使用uEdit时,在线管理图片功能不可用

    把所有的配置文件都配置好了,uedit的在线管理功能图片还是不可用,看了一下源码: 是的,它在img的src属性后边的图片上加上了参数,那肯定不能用啊,所以修改源文件image.js.直接搜索noCa ...

  3. 从零开始用golang创建一条简单的区块链

    区块链(Blockchain),是比特币的一个重要概念,它本质上是一个去中心化的数据库,同时作为比特币的底层技术,是一串使用密码学方法相关联产生的数据块,每一个数据块中包含了一批次比特币网络交易的信息 ...

  4. JS思考遍历对象

    var json={ “name”:”小明”, “age”:”10”, “sex”:”男” } for(var key in json); //key只是个变量名 console.log(key); ...

  5. 11 种在大多数教程中找不到的JavaScript技巧

    当我开始学习JavaScript时,我把我在别人的代码.code challenge网站以及我使用的教程之外的任何地方发现的每一个节省时间的技巧都列了一个清单. 在这篇文章中,我将分享11条我认为特别 ...

  6. 地图的标注Marker

    (1)在point处添加标注:var marker = new BMap.Marker(point); (2)添加覆盖物:map.addOverlay(marker); (3)激活标注的拖拽功能:ma ...

  7. 把功能强大的Spring EL表达式应用在.net平台

    Spring EL 表达式是什么? Spring3中引入了Spring表达式语言—SpringEL,SpEL是一种强大,简洁的装配Bean的方式,他可以通过运行期间执行的表达式将值装配到我们的属性或构 ...

  8. 文件操作——RandomAccessFile

      文件操作——RandomAccessFile 构建RandomAccessFileJava提供了一个可以对文件随机访问的操作,访问包括读和写操作.该类名为RandomAccessFile.该类的读 ...

  9. spring5 源码深度解析----- @Transactional注解的声明式事物介绍(100%理解事务)

    面的几个章节已经分析了spring基于@AspectJ的源码,那么接下来我们分析一下Aop的另一个重要功能,事物管理. 事务的介绍 1.数据库事物特性 原子性多个数据库操作是不可分割的,只有所有的操作 ...

  10. Python开发专属壁纸下载与轮换程序

    本人对于壁纸一直偏佛系,不爱特意去找一堆壁纸.因此用Python简单地搞了一个自动下载壁纸,定时随机轮换的功能来自娱自乐,顺便分享给大家. 原文链接:https://www.codernice.top ...