zoukankan      html  css  js  c++  java
  • SpringBoot自定义servlet、注册自定义的servlet、过滤器、监听器、拦截器、切面、webmvcconfigureradapter过时问题

    【转】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获得控制

          

     View Code

        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: 实在类级别设置,本博文未进行设置;参考博文 -> 点击前往

        

     View Code

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

          

     View Code

       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接口,在类级别上没有任何注解

     TimeFilter.java

        3.3.2 java配置类

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

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

            

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

          

     View Code
     WebConfig.java

    4 监听器

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

      4.1 自定义监听器

        

     View Code

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

        

     View Code

    5 拦截器

      5.1 HandlerInterceptor

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

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

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

        

     View Code

      5.2 创建自定义拦截器

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

        

     View Code

        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就失效了,解决办法在下面一节

        

     View Code

    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中的所有方法,仅仅根据需求进行重写就可以啦

  • 相关阅读:
    Zepto跨域请求
    C语言中浮点数的比较
    IOS开源项目Telegram初试
    Java NIO初试
    ios8.0之后注册通知中心
    spring AOP的配置
    IOS学习日记-2014年10月25日
    struct框架中实体类中属性的类型错误问题
    Oracle存储过程使用DML语句问题
    跳出类似framset 嵌入式框架
  • 原文地址:https://www.cnblogs.com/exmyth/p/11339762.html
Copyright © 2011-2022 走看看