Spring boot servlet,filter,Listener,Interceptor

实战Spring Boot 2.0系列(五) - Listener, Servlet和Filter, Controller和Interceptor 前言 用户认证授权、日志记录 MDC、编码解码、UA 检查、多端对应等都需要通过 拦截请求 来进行处理。这时就需要 Servlet、Filter、Listener、Interceptor 这几种组件。而把非 Spring Boot 项目转换成 Spring Boot 项目,需要沿用以前的这些代码,所以有必要了解这它们的 用法 和 生命周期。 im... 阅读详情

Spring boot servlet,filter,Listener,Interceptor

上一节

Spring boot restTemplate

源码

源码地址


Spring boot 使用servlet

第一种方式:使用注解@WebServlet

@WebServlet 是java Servlet 3.0 提供的注解,标注在类上声明这是一个servlet, 类需要继承servlet

使用示例

@WebServlet(value = "/test/servlet", name = "myServlet1", asyncSupported = true,
        loadOnStartup = 0,
        initParams = {
        @WebInitParam(name = "param1", value = "value1")}
)
public class MyServlet1 extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("reqeust myServlet1");
        // 获取 init-param
        String param1 = getServletConfig().getInitParameter("param1");
        System.out.println("myServlet1  listener = " + getServletContext().getAttribute("myListener"));
        super.service(req, resp);
    }
}

属性简介
@WebServlet 中的每个属性都基本对应我们在web.xml中的配置

属性web.xml备注
name<servlet-name>servlet 名称
value<url-pattern>匹配的url
urlPatterns<url-pattern>匹配的url正则,和value必须二选一有值
loadOnStartup<load-on-startup>启动加载顺序
initParams<init-param>初始化参数
description<description>描述
displayName<display-name>显示的名称
    <servlet>
        <servlet-name></servlet-name>
        <servlet-class></servlet-class>
        <init-param>
            <param-name></param-name>
            <param-value></param-value>
        </init-param>
        <description></description>
        <load-on-startup></load-on-startup>
        <async-supported></async-supported>
    </servlet>
    <servlet-mapping>
        <servlet-name></servlet-name>
        <url-pattern></url-pattern>
    </servlet-mapping>

若在springboot 项目中使用的 嵌入Web容器;则需要使用@ServletComponentScan 扫描;
@WebFilter 过滤器和@WebLIstener 监听器使用同理也需要扫描

@SpringBootApplication
@ServletComponentScan(value = {"com.xiaodu.servlet", "com.xiaodu.filter", "com.xiaodu.listener"})
public class StartApplication {

    public static void main(String[] args) {
        SpringApplication.run(StartApplication.class, args);
    }
}

第二种方式:使用spring 提供的方式ServletRegistrationBean

在配置类中加入ServletRegistrationBean ; 即可使用

   @Bean
    public ServletRegistrationBean<MyServlet2> servletRegistrationBean() {
        ServletRegistrationBean<MyServlet2> servletRegistrationBean = new ServletRegistrationBean<>();
        servletRegistrationBean.setServlet(new MyServlet2()); // 设置servlet
        servletRegistrationBean.addUrlMappings("/test/servlet2"); // url
        servletRegistrationBean.setLoadOnStartup(0); // 启动加载顺序
        servletRegistrationBean.setAsyncSupported(true); // 是否支持异步
        servletRegistrationBean.setName("myServlet2"); // servlet-name
        // init-param
        Map<String, String> initParam = new HashMap<>();
        initParam.put("param", "value");
        servletRegistrationBean.setInitParameters(initParam);
        return servletRegistrationBean;
    }

spring boot 使用 filter

第一种方式:注解 @WebFilter

@webFilter 标注在类上,类需要继承Filter 实现doFilter 方法

@WebFilter(value = "/test/*", filterName = "myServletFilter1",
        initParams ={
        @WebInitParam(name = "filer1", value = "filer1-Value")
        }
)
public class MyServletFilter1 implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("myFilter 1");

        chain.doFilter(request, response);
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        String filer1 = filterConfig.getInitParameter("filer1");
        System.out.println("myFilter1 initParam = " + filer1);
    }
}

属性简介

属性web.xml备注
description<description>描述
displayName<display-name>显示名称
initParams<init-param>初始参数
filterName<filter-name>filter-name
servletNames<servlet-name>过滤那些servlet,通过servletName指定
value</url-pattern>url
urlPatterns</url-pattern>url
asyncSupported<async-supported>是否支持异步
 <filter>
        <filter-name></filter-name>
        <filter-class></filter-class>
        <async-supported></async-supported>
        <description></description>
        <init-param>
            <param-name></param-name>
            <param-value></param-value>
        </init-param>
        <display-name></display-name>
    </filter>
    <filter-mapping>
        <filter-name></filter-name>
        <url-pattern></url-pattern>
        <servlet-name></servlet-name>
    </filter-mapping>
第二种方式: 使用 FilterRegistrationBean
    @Bean
    public FilterRegistrationBean<MyServletFilter2> filterRegistrationBean() {
        FilterRegistrationBean<MyServletFilter2> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(new MyServletFilter2());
        // 指定过滤路径
        registrationBean.addUrlPatterns("/test/*");
        // 指定过滤servletRegistrantionBean
//        registrationBean.addServletRegistrationBeans(servletRegistrationBean());// 可以过滤那个servlet
        // 指定过滤servlet
//        registrationBean.addServletNames("myServlet2");
        // init filter param
        registrationBean.addInitParameter("filter2", "filter2-value");
        return registrationBean;
    }

spring boot 使用 Listener

第一种方式:注解@WebListener
@WebListener(value = "testListener")
public class MyServletContentListener implements ServletContextListener {

    private ServletContext servletContext;

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("listener init");
        this.servletContext = sce.getServletContext();
        servletContext.setAttribute("myListener", "attribute");
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("listener destroy");
    }
}
第二种方式:spring 提供的ServletListenerRegistrationBean
   @Bean
    public ServletListenerRegistrationBean<MyServletContentListener2> servletListenerRegistrationBean() {
        ServletListenerRegistrationBean<MyServletContentListener2> servletListenerRegistrationBean = new ServletListenerRegistrationBean<>();
        servletListenerRegistrationBean.setListener(new MyServletContentListener2());
        return servletListenerRegistrationBean;
    }

springboot 使用interceptor

interceptor 是spring 提供的拦截器,作用类似servlet Filter 的作用;不过他们使命不相同; filter 对 request 和 response 进行过滤任务,例如字符集设置; interceptor 则是更进一步能够拦截到具体方法执行前,可以对方法中的参数进行校验和权限认证等

创建拦截器

@Component
public class MyInterceptor1 implements HandlerInterceptor {

    // 方法执行前拦截
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("interceptor preHandle");
        return true;
    }

    // 方法处理后拦截
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("interceptor postHandle");

    }

    // 处理完成后,报错不报错都走
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("interceptor afterCompletion");
    }
}

加入和配置拦截器

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Autowired
    @Qualifier("myInterceptor1")
    private HandlerInterceptor handlerInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
    // 添加拦截器
        registry.addInterceptor(handlerInterceptor)
        // 拦截url 配置
                .addPathPatterns("/test/**");

    }
}

filer 和 interceptor 的区别和执行顺序

区别:
filter:
1. filter 是Java提供的servlet 技术规范中的;是在servlet 前后执行;是一种函数回调
interceptor:
interceptor 是 spring 框架提供的基于aop 和Java反射机制在方法执行前后进行拦截;

执行顺序:
filter前 -> interceptor.preHandle -> servlet(controller) -> interceptor.postHandle -> filter后


下一节

Spring boot test

Spring Boot入门教程(二十): Filter、Listener、Servlet、Interceptor 一:过滤器 Filter 声明过滤器并且在Application中使用@ServletComponentScan注解标注 @WebFilter(filterName = &amp;amp;amp;amp;quot;myFilter&amp;amp;amp;amp;quot;, urlPatterns = &amp;amp;amp;amp;quot;/*&amp;amp;amp;amp;quot;) public class MyFilter implements Fi 阅读详情

相关推荐

SAP与泛微OA集成(半导体行业)

本项目通过SAP PO中间件集成SAP与泛微OA在半导体行业的应用,由于行业特殊性,广泛深入应用了RSA加密等特性

集信通 1162

SpringBoot整合web:(1)servlet,filter,listener,interceptor

1.springboot整合servlet 1.1通过注解扫描完成 Servlet 组件的注册(方式一) 1.1.1编写servlet @WebServlet(name="firstServlet",urlPatterns="/first") public class FirstServlet extends HttpServlet{ @Override protected void ...

上善若泪 1805

Rapid SCADA MQTT

一、配置RapidSCADA 1、准备KpMqtt.dll、Jint.dll库文件,从网盘下载。 2、将以上两个文件拷贝到SCADA安装目录的Comm/KP目录下,如下: C:\SCADA\ScadaComm\KP 3、新建SCADA项目 4、新建Line 5、新建Device 6、拷贝Config目录下的KpMqtt_001.xml文件、KpMqtt_Job.js文件到项目Comm\Config下,如下示例链接 C:\SCADA\Projects\MQTTProject\Instances\Defau

mumanquan1的博客 3005

Springboot之filter、servlet、Interceptor

概述 我们先用一张图来了解一下filter、servlet、Interceptor之间的关系: Springboot实现Filter Springboot中有两种常用的实现Filter的方式:@WebFilter + @ServletComponentScan和JavaConfig 配置。 @WebFilter + @ServletComponentScan方式实现Filter 第一步:在Springboot的主启动类上加上@ServletComponentScan注解 @SpringBootApplic

qq_38571892的博客 1383

告别反复格式化!用Ventoy制作2025年终极启动盘,Windows/Linux/macOS一网打尽

本文详细介绍了如何使用Ventoy制作2025年终极多系统启动盘,彻底告别反复格式化U盘的烦恼。Ventoy通过创新的引导加载器架构,允许用户在一个U盘内同时存放并直接启动Windows、Linux、macOS等多种系统镜像和WePE等维护工具,实现真正的非破坏性管理和极高的U盘利用率。文章涵盖从安装配置、镜像库构建到安全启动设置等全流程实战指南。

weixin_29280219的博客 240

RPA与旅游与酒店行业自动化实战案例

1. 背景介绍 1.1 旅游与酒店行业的挑战 旅游与酒店行业是一个高度竞争的市场,企业需要不断提高服务质量、降低成本、提高效率以保持竞争力。在这个过程中,企业面临着诸多挑战,如客户需求多样化、市场变化快速、人力资源成本高昂等。为了应对这些挑战,企业需要寻求新的技术手段来提高运营效率。

AI天才研究院 615

【Spring Boot】Spring Boot Filter | Servlet 过滤器

文章目录1. 示例工具版本2. pom.xml3. 用 FilterRegistrationBean 注册过滤器3.1 过滤 URL 模式3.2 过滤器执行顺序4. 用@Component和@Order注册过滤器5. 使用 @ServletComponentScan 和 @WebFilter 注册过滤器6. 完整的例子。使用 FilterRegistrationBean 的 Spring Boot 过滤器映射7. 测试应用程序7.1 使用 Maven 命令7.2 使用 Eclipse7.3 使用可执行的 J

猫巳的博客 1743

【产品经理修炼之道】- 基金产品-“TA系统 ”

TA:Transfer Agent 缩写,通常称成“登记过户”。开放式基金登记过户(TA)系统是基金的登记过户系统。其功能涵盖了基金交易业务的各个环节,包括账户业务处理,如投资者开户、修改账户资料、挂失/解挂等;日常交易业务处理,如认购、申购(一般申购和定期定额)、赎回(一般赎回、指定赎回、预约赎回等)、转托管、基金转换等;特殊业务处理,如非交易过户、账户冻结/解冻等;分红业务处理,如现金分红和红利再投资。

xiaoli8748的专栏 1673

SpringBoot工程中异步(Async)操作实践

SpringBoot工程中异步(Async)操作实践 SpringBoot工程中事务控制 SpringBoot 工程中三大JAVAEE组件注册及应用

qq_25447799的博客 1589

【从零开始入门unity游戏开发之——C#篇01】理论开篇,理解什么是编程

理论开篇,理解什么是编程

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 3109

手把手入门YOLO到改进优化教程 | 【P5进阶篇】YOLOv8损失函数改进实战-损失函数IoU之KLD Loss

在本节,将从 KLD Loss(Kullback–Leibler Divergence Loss)的理论到实战代码实现,带你把 KLD Loss融合进 YOLOv8 的训练框架中。并通过训练日志与实验结果,验证 KLD Loss 在实际工程中的优势。

嵌入式阿齐Archie 2万+

Spring boot中使用servlet filter

Spring boot中使用servlet filter liuyuhang原创,未经允许请勿转载! 在web项目中经常需要一些场景,如参数过滤防止sql注入,防止页面攻击,空参数矫正等, 也可以做成token验证,session验证,点击率统计等。 为了这种业务,经常会需要写过滤器(Filter)。 servlet提供的默认过滤器比较好用,配置也还算方便; 转入spr...

anyu0190的博客 264

海外购物商城源码 带即时通讯IM源码

在海外购物商城中,即时通讯IM源码可以为用户提供更便捷、高效的沟通方式,帮助解决跨国交易中的语言和文化差异问题。总之,即时通讯IM源码在海外购物商城中扮演着重要的角色,可以为用户提供更方便、高效的沟通方式,解决跨国交易中的语言和文化差异问题。(购买本专栏可免费下载栏目内所有资源不受限制,持续发布中,需要注意的是,本专栏为批量下载专用,并无法保证某款源码或者插件绝对可用,介意不要购买)实时翻译:即时通讯IM源码提供实时翻译功能,能够快速准确地翻译不同语言之间的文字、语音、视频等信息,帮助用户克服语言障碍。

很酷的站长的博客 259

Spring Boot 的Servlet、Filter 、 Listener和Interceptor

先上两个网上找到的图,大家先有个大概认识 1、Servlet 回顾下javaEE的开发步骤(这里是大致配置和流程): 1.在web.xml中配置servlet和servletMapping 2.书写servlet标签里面配置的类,类需要继承HttpServlet,然后复写里面的doGet,doPost方法(当然还有init,des...

持之以恒! 6957

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Spring Boot 使用 Filter、Servlet、Listener、Interceptor

Filter 1)SpringBoot 启动时默认加载四个 Filter characterEncodingFilter、hiddenHttpMethodFilter、httpPutFormContentFilter、requestContextFilter 2)Filter 优先级 Ordered.HIGHEST_PRECEDENCE 表示最高的优先级,对应最小的整数值;Or...

weixin_30783629的博客 196

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Spring Boot自定义注册 Servlet、Filter、Listener、Interceptor

一、前言 在 Spring Boot 中已经移除了 web.xml ,如果需要注册添加 Servlet、Filter、Listener 为 Spring Bean,在 Spring Boot 中有两种方式: 使用 Servlet 3.0 API 的注解 @WebServlet、@WebFilter、@Listener 用来配置。 Spring Boot JavaConfig 注解配置 Bean 的方式来进行配置。 二、注册之前 在使用 Servlet 时,需要在 Spring .

程序员咏哥的博客 521

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Spring Boot参考教程(六)Spring Boot配置Servlet,Filter,Listener,Interceptor

4.2.5. Spring Boot配置Servlet,Filter,Listener,Interceptor 1. 配置Servlet 在开发中一些场景常会使用到servlet,如用户登出等.下面演示如何进行配置. 配置使用Servlet有两种方式,一种时使用注解方式,一种使...

chunxingyang3249的博客 128

Spring Boot-- Servlet、Filter、Listener、Interceptor

Spring Boot-- Servlet、Filter、Listener、Interceptor 在Spring Boot中让Servlet、Listener、Filter生效的方法: 在Application上使用@ServletComponentScan注解标注 配置一个WebConfig @Configuration public class WebConfig { @Bea...

lolwsyzc的博客 202

Spring Boot 入门 - 进阶篇(1)- Servlet、Filter、Listener、Interceptor

用户认证授权、日志记录MDC、编码解码、UA检查、多端对应等都需要通过拦截请求来共通处理,这时就需要Filter、Listener、Interceptor。而把非Spring Boot项目转换成Spring Boot项目需要沿用以前的这些代码,所以有必要了解这几个东西的用法。 通常来说,用户通过浏览器发起Request进入服务器后侧处理顺序如下: [quote]Client -> List...

Fish Where The Fish Are 470

spring boot (二) servlet listener filter interceptor

spring boot 二 servlet listenerfilter interceptor            一般做web开发,使用controller就可以满足大部分的需要,但是有的时候也会用到servlet listener filter 和interceptor等,spring boot中取消了繁杂的xml配置,但是功能并没有减少,所以要对于这些需求,也有相应的解决办法。

凡夫编程 553

Spring Boot 编写Servlet、Filter、Listener、Interceptor的方法

在编写过滤器、监听器、拦截器之前我们需要在spring-boot启动的类上加上注解@ServletComponentScan:?1234567@SpringBootApplication@ServletComponentScanpublic class MySpringbootApplication {  public static void main(String[] args) {   Spr...

myself8202的博客 315

Spring Boot配置Servlet,Filter,Listener,Interceptor

https://blog.youkuaiyun.com/m0_37546724/article/details/78163408

weixin_36098377的博客 205

从Spring-Boot开始深入理解Spring系列(七)——Spring-Boot使用servlets、filter、listener、interceptor

文章目录基础概念理解对比深入理解:原理详解生命周期理解实战:示例应用项目实战应用场景附源码下载参考博客 基础概念理解 对比 深入理解: 原理详解 生命周期理解 实战: 示例应用 项目实战应用场景 附 源码下载 参考博客 ...

softwareCraftsman 591
上一篇: spring微服务全家桶基础入门学习指南
下一篇: Spring boot test
xiaoduup
博客等级 码龄9年 23粉丝 83原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值