【转】https://www.cnblogs.com/NeverCtrl-C/p/8191920.html

1 servlet简介

  servlet是一种用于开发动态web资源的技术

  参考博客:servlet基础知识     httpservlet详解

2 在springboot应用中添加servlet

  springboot的主servlet是DispacherServlet,它默认的url-pattern是“/”,如果我们还需要其他的servlet就需要开发人员自己进行定义和注册

  2.1 springboot支持代码和注解来注册servlet

    2.1.1 代码注册

      通过ServletRegistrationBean获得控制

      

 

    2.1.2 注解注册

      在启动类上标注@ServletComponentScan,在自定义的servlet类上标注@WebServlet即可

      

      

 启动类
 自定义Servlet

    2.1.3 效果展示

      任何url是以/myServlet开始的请求都会返回一样的结果

      

  2.2 自定义servlet

    继承HttpServlet,再根据需求重写相关方法即可

    

    技巧01:如果是用代码进行注册就不需要在自定义的servlet类上标注@WebServlet(urlPatterns = "/myServlet")

 WebServlet源码
 自定义servlet

  2.3 参考博文

    点击前往

3 过滤器

  过滤器和servlet一样,支持代码注册和注解注册;

  过滤器可以拿到原始请求和响应的相关信息但是拿不到控制方法的相关信息

  3.1 实现方式01

    3.1.1 编写自定义过滤器

      技巧01:必须实现 Filter 接口

      技巧02:init() 方法用于初始化,项目启动的时候就会被调用,而且只会被调用一次

      技巧03:destroy() 方法用于销毁,项目关闭的时候会被调用,而且只会被调用一次

      技巧04:doFilter() 方法用户处理过滤逻辑,只要满足过滤条件就会被执行;在doFilter方法中必须执行FilterChain对象的doFilter方法,否则前端过来的请求就不会进入到控制层

      技巧05:@WebFilter(urlPatterns = "/*") 注解的作用是指定过滤的请求路径,是一个String类型的数组

      技巧06:可以利用 @Order(Integer类型) 来设置该过滤器的顺序号(PS: 实在类级别设置,本博文未进行设置;参考博文 -> 点击前往

    

    3.1.2 在springboot应用启动类上标注@ServletComponentScan

      

  3.2 实现方式02

    创建一个过滤器类,该类必须实现Filter接口;直接在该过滤器类中添加@Component注解后该过滤器就会生效,无需再做其他任何操作

    技巧01:这种方式默认会对所有的请求进行拦截

    技巧02:通常只有一个过滤器时使用这种方式,而且这种方式只适用于自定义的过滤器

 TimeFilter.java

  3.3 实现方式03

    实现方式01和实现方式02都只适用于自定义的过滤器,而不适用与第三方的过滤器;如果需要实现第三方的过滤器就必须在web.xml中进行Bean配置

    技巧01:SpringBoot项目没有web.xml文件,所以必须进行java配置

    技巧02:推荐使用这种方式实现过滤器

    3.3.1 导入第三方的过滤器相关jar包

      技巧01:本案例用一个自定义的过滤器类来模拟第三方过滤器;该自定义过滤器仅仅实现了Filter接口,在类级别上没有任何注解

    3.3.2 java配置类

      技巧01:创建一个java类,类级别上添加 @Configuration 来注明该类是一个java配置类;这个类的作用就相当于web.xml

      技巧02:定义一个方法,该方法的返回类型是 FilterRegistrationBean ;并在自定义方法上添加 @Bean 注解;这个方法的作用就相当于在web.xml中配置Bean

        

    技巧03:可以在配置类中设置过滤器名称、过滤器顺序号以及过滤排除规则

      

 WebConfig.java

4 监听器

  监听器同样支持代码和注解两种注册方式

  4.1 自定义监听器

    

  4.2 在springboot应用启动类上标注@ServletComponentScan

    

5 拦截器

  5.1 HandlerInterceptor

    spring为我们提供了HandlerInterceptor接口来实现拦截器功能

    HandlerInterceptor在调用controller之前和调用controller之后以及视图渲染完成之后都可以得到控制;我们不可以通过拦截器来修改request内容,但是我们可以通过抛出异常或者返回false来结束请求

    技巧01:拦截器可以获取到原始的请求和响应信息,也可以拿到controlelr层的类名信息和方法名信息;但是拿不到方法的参数信息;因为DispatcherServlet在进行请求分发时先执行拦截器,然后在将请求数据封装到controller层中控制方法的参数上去的。

    

  5.2 创建自定义拦截器

    自定义拦截器需要实现HandlerInterceptor接口,然后根据自己的需求去重写相应的方法

    

    5.2.1 preHandle

      调用controller之前执行,如果该方法返回false或者抛出异常就会结束请求

      技巧01:preHandle返回false或者抛出异常是就不会在继续往下执行(即:不会在今日conroller层,也不会执行postHandle和afterCompletion)

    5.2.2 postHandle

      调用controller之后视图渲染完成之前

      技巧01:如果controller层中的方法抛出了异常就会不会执行该方法了

    5.2.3 afterCompletion

      视图渲染完成之后

      技巧01:不管controller层是否抛出异常都会执行该方法,只有preHandle返回false或者preHandle方法中抛出异常才不会执行该方法

  5.3 配置自定义拦截器

    spring为我们提供了 WebMvcConfigurerAdapter 我们只需要重写addInterceptors方法就可以实现自定义拦截器的配置

    技巧01:继承了WebMvcConfigurerAdapter类后我们可以通过该重写相关方法来实现配置

    坑01:从spring5.0和springBoot2.0开始WebMvcConfigurerAdapter就失效了,解决办法在下面一节

    

6 切面(AOP)

  6.1 切面三要素

    》切哪里 -> 切入点

    》什么时候切 -> 增强

    》干什么 -> 增强逻辑

  6.2 自定义切面类

    技巧01:在切面类上添加@Aspect 和 @Component

 TimeAspect.java

  6.3 AOP参考博文

    点击前往

  6.4 过滤器、拦截器、切面执行顺序

    

7 webmvcconfigureradapter过时问题

  在修改一些SpringBoot的默认配置时需要继承webmvcconfigureradapter,但是从spring5.0和springboot2.0开始这个类就逐渐被废弃掉了;但是从webmvcconfigureradapter的源码可以看出这个类实现了WebMvcConfigurer接口,所以我们可以在自定义的配置类中直接实现WebMvcConfigurer接口即可

  技巧01:虽然是实现了WebMvcConfigurer接口,但是不需要重写WebMvcConfigurer中的所有方法,仅仅根据需求进行重写就可以啦

SpringBoot自定义servlet、注册自定义的servlet、过滤器、监听器、拦截器、切面、webmvcconfigureradapter过时问题的更多相关文章

  1. SpringBoot入坑指南之六:使用过滤器或拦截器

    在Web应用中,常常存在拦截全部或部分请求进行统一处理的应用场景,如权限校验.参数校验.性能监控等. 在SpringMVC框架中,我们可以通过过滤器或拦截器实现相关功能,spring-boot-sta ...

  2. JavaWeb过滤器.监听器.拦截器-原理&区别-个人总结

    对比项 拦截器 过滤器 机制 反射机制 函数回调 是否依赖servlet容器 是 否 请求处理 只能对action请求起作用 几乎所有的请求起作用 对action处理 可以访问action上下文.值栈 ...

  3. JavaWeb过滤器.监听器.拦截器-原理&区别(转)

    1.拦截器是基于java的反射机制的,而过滤器是基于函数回调 2.过滤器依赖与servlet容器,而拦截器不依赖与servlet容器 3.拦截器只能对action请求起作用,而过滤器则可以对几乎所有的 ...

  4. AOP,过滤器,监听器,拦截器【转载】

    面向切面编程(AOP是Aspect Oriented Program的首字母缩写) ,我们知道,面向对象的特点是继承.多态和封装.而封装就要求将功能分散到不同的对象中去,这在软件设计中往往称为职责分配 ...

  5. JavaWeb过滤器.监听器.拦截器-?原理&区别

    过滤器可以简单理解为“取你所想取”,忽视掉那些你不想要的东西:拦截器可以简单理解为“拒你所想拒”,关心你想要拒绝掉哪些东西,比如一个BBS论坛上拦截掉敏感词汇. 1.拦截器是基于java的反射机制,过 ...

  6. 过滤器 & 监听器 & 拦截器

    过滤器: https://blog.csdn.net/MissEel/article/details/79351231 https://blog.csdn.net/qq_32363305/articl ...

  7. struts2动态调用+Servlet过滤器+struts2拦截器

    周末真的是懒到心慌...... 本文是在完整s2sh项目基础上添加的,不太了解s2sh项目构建的朋友可以先参考一下这几篇文章: eclipse环境下基于tomcat-7.0.82构建struts2项目 ...

  8. Servlet 过滤器、拦截器、监听器以及文件上传下载

    在学习之初,总是对过滤器.拦截器.监听器这三个搞不清楚,现在进行一些记录,方便大家交流,也为了提高自身的学习能力! 如果想要了解这三个的作用,首先对servlet流程进行熟悉了解,servlet是客户 ...

  9. springboot(五)过滤器和拦截器

    前言 过滤器和拦截器二者都是AOP编程思想的提现,都能实现诸如权限检查.日志记录等.二者有一定的相似之处,不同的地方在于: Filter是servlet规范,只能用在Web程序中,而拦截器是Sprin ...

  10. SpringBoot第五集:整合监听器/过滤器和拦截器(2020最新最易懂)

    SpringBoot第五集:整合监听器/过滤器和拦截器(2020最新最易懂) 在实际开发过程中,经常会碰见一些比如系统启动初始化信息.统计在线人数.在线用户数.过滤敏/高词汇.访问权限控制(URL级别 ...

随机推荐

  1. LeetCode:按序打印【1114】

    LeetCode:按序打印[1114] 题目描述 我们提供了一个类: 1 2 3 4 5 public class Foo {   public void one() { print("on ...

  2. Linux下操作数据库

    一.安装数据库   1.卸载旧版本 检查是否安装有MySQL Server:rpm -qa | grep mysql rpm -e mysql_libs   //普通删除模式 rpm -e --nod ...

  3. Python 数据处理库pandas教程(最后附上pandas_datareader使用实例)

    0 简单介绍 pandas是一个Python语言的软件包,在我们使用Python语言进行机器学习编程的时候,这是一个非常常用的基础编程库.本文是对它的一个入门教程. pandas提供了快速,灵活和富有 ...

  4. LeetCode 53. 最大子序和(Maximum Subarray)

    53. 最大子序和 53. Maximum Subarray 题目描述 给定一个整数数组 nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. LeetCode53. M ...

  5. LeetCode 442. 数组中重复的数据(Find All Duplicates in an Array) 17

    442. 数组中重复的数据 442. Find All Duplicates in an Array 题目描述 Given an array of integers, 1 ≤ a[i] ≤ n (n ...

  6. [转帖]PCIe 6.0 v0.3版本草案已完稿:2021年转正、x16带宽飙至128GB/s

    PCIe 6.0 v0.3版本草案已完稿:2021年转正.x16带宽飙至128GB/s https://www.cnbeta.com/articles/tech/899389.htm 硬件发展突飞猛进 ...

  7. 从零开始学Flask框架-006

    重定向和用户会话 因为刷新页面时浏览器会重新发送之前已经发送过的最后一个请求.如果这个请求是一个包含表单数据的POST 请求,刷新页面后会再次提交表单. 基于这个原因,最好别让Web 程序把POST ...

  8. k8s开发实践

    代码自动生成:https://blog.openshift.com/kubernetes-deep-dive-code-generation-customresources/ 自定义controlle ...

  9. 【leecode】 Course Schedule

    class Solution { public: static bool canFinish(int numCourses, vector<pair<int, int>>&am ...

  10. idea的项目结构

    idea项目结构: 一般是创建一个empty project,然后再创建一个个的Module.