filter过滤后重新添加_Spring Boot 2.X(十):自定义注册 Servlet、Filter、Listener

ba385f1d672e45844aa79762175720e8.png

前言

在 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@ServletComponentScanpublic class SpringBootServletApplication {    public static void main(String[] args) {        SpringApplication.run(SpringBootServletApplication.class, args);    }}

注册 Servlet

1.@WebServlet 属性

属性类型描述nameString指定Servlet名称,等价于valueString[]等同于 urlPatterns 属性,两者不应该同时使用urlPatternsString[]指定一组 Servlet 的 URL 匹配模式。等价于标签loadOnStartupint指定 Servlet 的加载顺序,等价于 标签initParamsWebInitParam[]指定一组 Servlet 初始化参数,等价于标签asyncSupportedboolean声明 Servlet 是否支持异步操作模式,等价于 标签smallIconString此 Servlet 的小图标largeIconString此 Servlet 的大图标descriptionString该 Servlet 的描述信息,等价于 标签displayNameString该 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")等价于以下代码:

 TestServlet  cn.zwqh.springbboot.servlet.TestServlet  TestServlet  /TestServlet 

3.测试

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

8e5bb8911a687c02b6551bb90aee9bbf.png

日志输出:

9cf4e453d745aa1e0fe00791f407a4e5.png

注册 Filter

1.@WebFilter 属性

属性类型描述filterNameString指定Filter名称,等价于valueString[]等同于 urlPatterns 属性,两者不应该同时使用urlPatternsString[]指定一组 Filter 的 URL 匹配模式。等价于标签servletNamesString[]指定过滤器将应用于哪些 Servlet。取值于 @WebServlet 中的 name 属性,或者是 web.xml 中 的值initParamsWebInitParam[]指定一组 Filter 初始化参数,等价于标签dispatcherTypesDispatcherType[]指定 Filter 的转发模式,包括:ASYNC、ERROR、FORWARD、INCLUDE、REQUESTasyncSupportedboolean声明 Filter 是否支持异步操作模式,等价于 标签smallIconString此 Filter 的小图标largeIconString此 Filter 的大图标descriptionString该 Filter 的描述信息,等价于 标签displayNameString该 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 :

2864a5454edb2b9f9e5af94bdee9eb91.png

日志打印:

be81de5411723251a39f976c7a0c8919.png

4.Filter 主要使用场景

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

注册 Listener

1.@Listener 属性

属性类型描述valueString侦听器Listener的描述

2.示例

与 ServletContext 相关的监听

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

@WebListenerpublic 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 相关的监听

@WebListenerpublic 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 相关的监听

@WebListenerpublic 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.项目相关日志输入(启动和停止)

9a0dbf26e3e15ce83add2808898b19f7.png

先执行 contextInitialzed 方法在执行 TestFilter 类的 init 方法,contextDestroyed 方法在 TestFilter 类 destroy 方法执行后执行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/331891.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

对象克隆+深浅拷贝

【0】README 0.1) 本文描述源代码均 转自 core java volume 1, 旨在理解 对象拷贝 的概念 , 特别是对 深拷贝和浅拷贝 的理解; 0.2) 最后,我们还要看一个 clone 的荔枝; 【1】对象克隆相关 1…

read cache_通过READ-BEHIND CACHE控制您的慢速生产者

read cache在我们的互联世界中,我们经常使用我们不拥有或无权改善的API中的数据。 如果一切顺利,他们的表现就会很好,每个人都会高兴。 但是太多次,我们不得不使用延迟小于最佳延迟的 API。 当然,答案是缓存该数据 。…

azkaban mysql参数_azkaban参数详解

参数传递是调度字体工作流运行时非常重要的一部分,工作流的执行,单个作业的执行,多个工作流之间的依赖执行,历史任务重算,都涉及到参数传递和同步。1 参数类型综述azkaban的工作流中的参数可以分为如下几个类型&#x…

接口与回调

【0】README 0.1) 本文描述源代码均 转自 core java volume 1, 旨在理解 接口与回调 概念 ; 【1】接口与回调相关 1.1)回调定义: 回调是一种常见的程序设计模式, 在这种模式中, 可以指出某个…

spring react_使用Spring Cloud Gateway保护React式微服务

spring react朋友不允许朋友写用户身份验证。 厌倦了管理自己的用户? 立即尝试Okta的API和Java SDK。 数分钟之内即可在任何应用程序中对用户进行身份验证,管理和保护。 所以你想完全React,是吗? 大! React式编程是使…

mysql断电同步不起作用_mysql主从同步因断电产生的不能同步问题

偶尔因为断电导致mysql slave 出现复制错误“Could not parse relay log event entry”Could not parse relay log event entry. The possible reasons are: the masters binary log is corrupted (you can check this by running mysqlbinlog on the binary log), the slaves …

图论——Dijkstra+prim算法涉及到的优先队列(二叉堆)

【0】README 0.1)为什么有这篇文章?因为 Dijkstra算法的优先队列实现 涉及到了一种新的数据结构,即优先队列(二叉堆)的操作需要更改以适应这种新的数据结构,我们暂且吧它定义为Distance, 而不是…

cucumber测试_如何在Cucumber中进行后端测试

cucumber测试Cucumber是一种规范语言的执行框架。 它并不是要成为测试语言,而是用于创建测试自动化。 Cucumber最适合出现一些实际参与者互动并取得某种成果的情况。 当可以从用户的角度编写它时,它特别有用。 Given Sarah is a premium club member W…

linux mysql删除密码忘记了_linux下忘记mysql密码的几种找回方法(推荐)

今天我们主要是讲一下关于linux忘记mysql密码处理方法,下面提供了5种linux忘记mysql密码找回方法哦。方法一(先进入root权限):# /etc/init.d/mysql stop# mysqld_safe --usermysql --skip-grant-tables --skip-networking &# mysql -u rootmysql>…

Dijkstra 算法——计算有权最短路径(边有权值)

【0】README 0.1) 本文总结于 数据结构与算法分析, 源代码均为原创, 旨在理解 Dijkstra 的思想并用源代码加以实现; 0.2)最短路径算法的基础知识,参见 http://blog.csdn.net/pacosonswjtu/article/detail…

spring使用自定义注解_用Spring组成自定义注释

spring使用自定义注解Java批注在2004年随Java 5一起引入,是一种将元数据添加到Java源代码中的方法。 如今,许多主要框架(如Spring或Hibernate)都严重依赖注释。 在本文中,我们将介绍一个非常有用的Spring功能&#xf…

打印结果和调试结果不一样(C语言)

【0】README 0.1)本文旨在阐述 个人的debug经历,遇到的各种debug 奇葩问题, 说是奇葩,其实也是自己 不小心或者说是编程习惯不好; 【1】debug和running的运行结果不一致(乍眼一看,你肯定醉了&a…

mysql add default_MySQL中create table DEFAULT 用法

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)][table_options] [select_statement]TEMPORARY:该关键字表示用create table新建的表为临时表,此表在当前会话结束后将自动消失。临时表主要被应用于存储过程中,…

jakarta ee_Jakarta EE贡献–入门

jakarta ee您是否有兴趣帮助Jakarta EE向前发展? 我也是。我想提供一些详细信息,以帮助有兴趣入门的人。 第1步: 开始捐款的第一步是签署Eclipse Foundation Committer and Contributor Agreement(ECA): …

最小生成树基础

【0】README 0.1) 本文总结于 数据结构与算法分析, 源代码均为原创, 旨在 review 最小生成树的基础知识; 0.2)了解本文的内容是 分析 Prim算法(普利姆算法)和 Kruskal算法(克鲁斯卡…

mysql dump gtid_mysqldump命令详解 Part 3- 备份全库

前面说了MySQL Linux平台和Windows平台的安装下面开始是MySQL的一些学习笔记前面我们说了如果构造数据这节开始说MySQL 的备份环境为MySQL 5.7.25在解释命令之前我们先弄清楚数据库中有哪些对象上一节我们建立了数据库并建立相关的对象数据库表存储过程函数触发器事件这节讲一些…

apache lucene_Apache Lucene中的并发查询执行

apache luceneApache Lucene是一个出色的并发纯Java搜索引擎,如果您愿意,它可以轻松地使服务器上的可用CPU或IO资源饱和。 “典型” Lucene应用程序的并发模型在搜索时每个查询一个线程,但是您是否知道Lucene也可以使用多个线程同时执行一个查…

最小生成树——Prim(普利姆)算法

【0】README 0.1) 本文总结于 数据结构与算法分析, 源代码均为原创, 旨在 理解Prim算法的idea 并用 源代码加以实现; 0.2)最小生成树的基础知识,参见 http://blog.csdn.net/pacosonswjtu/article/details…

mysql grant usage on_grant 权限 on 数据库对象 to 用户

grant 权限 on 数据库对象 to 用户一、grant 普通数据用户,查询、插入、更新、删除 数据库中所有表数据的权利。grant select on testdb.* to common_user’%’grant insert on testdb.* to common_user’%’grant update on testdb.* to common_user’%’grant del…

openjdk8 项目结构_OpenJDK织机和结构化并发

openjdk8 项目结构Project Loom是Hotspot Group赞助的项目之一,旨在向JAVA世界提供高吞吐量和轻量级的并发模型。 在撰写本文时,Loom项目仍在积极开发中,其API可能会更改。 为什么要织机? 每个新项目可能会出现的第一个问题是为什…