相关推荐recommended
Spring Boot学习随笔- 拦截器实现和配置(HandlerInterceptor、addInterceptors)、jar包部署和war包部署
作者:mmseoamin日期:2024-01-18

学习视频:【编程不良人】2021年SpringBoot最新最全教程

第十三章、拦截器

Spring Boot学习随笔- 拦截器实现和配置(HandlerInterceptor、addInterceptors)、jar包部署和war包部署,第1张

  1. 拦截器 :Interceptor 拦截 中断

    类似于javaweb中的Filter,不过没有Filter那么强大

  2. 作用

    Spring MVC的拦截器是一种用于在请求处理过程中进行预处理和后处理的机制。拦截器可以在请求到达控制器之前和之后执行一些操作,例如日志记录、权限验证、数据处理等。

  3. 拦截器特点

    1. 请求到达会经过拦截器,响应回来同样会经过拦截器
    2. 拦截器只能Controller的请求,不能拦截jsp、静态资源相关请求
    3. 拦截器可以中断请求轨迹

拦截器实现

  • 开发步骤
    1. 配置拦截器 实现**HandlerInterceptor**,这个类通常包含**preHandle、postHandle和afterCompletion**三个方法,分别用于请求处理之前、之后以及完成后执行自定义逻辑。

      @Component
      public class MyInterceptor implements HandlerInterceptor {
          private final Logger log = LoggerFactory.getLogger(MyInterceptor.class);
          @Override
          //参数1:当前请求对象  参数2:当前请求响应对象 参数3:当前请求的控制器对应的方法对象
          public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
              log.debug("======1========");
              return HandlerInterceptor.super.preHandle(request, response, handler);
          }
          @Override
          // 参数1、2、3同上 参数4:当前控制器方法的返回值
          public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
              log.debug("======2========");
              log.debug("view:{}",modelAndView.getViewName());
              HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
          }
          @Override
          // 参数1、2、3同上 参数4:请求过程中出现异常时的异常对象
          // 这个方法总是会执行 无论请求正确或出现异常
          public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
              log.debug("======3========");
              HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
          }
      }
      
    2. 创建配置类,目的是将拦截器注册到程序中,在这个配置类中,你需要重写**addInterceptors方法,并在其中将拦截器添加到InterceptorRegistry**中。

      @Configuration
      public class MvcConfig implements WebMvcConfigurer {
          @Autowired
          private MyInterceptor myInterceptor;
          @Override
          public void addInterceptors(InterceptorRegistry registry) {
              registry.addInterceptor(myInterceptor)// 指定拦截器
                      .addPathPatterns("/**")// 拦截所有
                      .excludePathPatterns("file/**");//排除拦截
          }
      }
      
    • 注意

      多个拦截器注册到配置类中,他们的执行顺序是按照栈一样的顺序,第一个拦截器先执行,那么该拦截器也是最后退出的。秉承先进后出的原理

      @Configuration
      public class MvcConfig implements WebMvcConfigurer {
          @Autowired
          private MyInterceptor myInterceptor;
          @Autowired
          private MyInterceptor2 myInterceptor2;
          @Override
          public void addInterceptors(InterceptorRegistry registry) {
              registry.addInterceptor(myInterceptor)// 指定拦截器
                      .addPathPatterns("/**")// 拦截所有
                      .excludePathPatterns("file/**");//排除拦截
              registry.addInterceptor(myInterceptor2)// 指定拦截器
                      .addPathPatterns("/**")// 拦截所有
                      .excludePathPatterns("file/**");//排除拦截
          }
      }
      
      • 执行结果

        Spring Boot学习随笔- 拦截器实现和配置(HandlerInterceptor、addInterceptors)、jar包部署和war包部署,第2张

      • 可以通过order参数修改执行顺序

        @Configuration
        public class MvcConfig implements WebMvcConfigurer {
            @Autowired
            private MyInterceptor myInterceptor;
            @Autowired
            private MyInterceptor2 myInterceptor2;
            @Override
            public void addInterceptors(InterceptorRegistry registry) {
                registry.addInterceptor(myInterceptor)// 指定拦截器
                        .addPathPatterns("/**")// 拦截所有
                        .excludePathPatterns("file/**") //排除拦截
                        .order(2);
                registry.addInterceptor(myInterceptor2)// 指定拦截器
                        .addPathPatterns("/**")// 拦截所有
                        .excludePathPatterns("file/**")//排除拦截
                        .order(1);
            }
        }
        

        第十四章、项目部署

        Spring Boot 项目可以通过多种方式部署:

        1. 传统服务器部署:将 Spring Boot 项目打包成可执行的War/ JAR 文件,然后将该 War/JAR 文件上传到服务器并运行。这种方式需要确保服务器上已经安装了 Java 运行环境。
        2. Docker 容器部署:将 Spring Boot 项目打包成 Docker 镜像,然后在 Docker 容器中运行该镜像。这种方式可以实现环境的快速部署和一致性。
        3. 云平台部署:将 Spring Boot 项目部署到云平台,比如 Heroku、Google Cloud Platform (GCP)、Amazon Web Services (AWS) 等。这些云平台提供了简单的部署流程和弹性的扩展能力。
        4. 自动化部署工具:使用自动化部署工具,比如 Jenkins、GitLab CI/CD 等,实现持续集成和持续部署。这种方式可以自动化构建、测试和部署 Spring Boot 项目。

        目前讲的就是传统部署方式,分为两种:

        • war部署(linux系统)
          1. 安装jdk
          2. 安装tomcat
          3. 安装数据库
          4. 部署项目war放到tomcat weapps
        • jar部署(linux系统)
          1. 安装jdk
          2. 安装数据库
          3. 运行项目java-jar项目.jar

          war包部署

          1. 目前创建springboot项目默认都是jar包部署,需要修改设置pom.xml

            war
            
          2. 删除内嵌tomcat依赖

             
                org.apache.tomcat.embed
                tomcat-embed-jasper
                
                provided
            
            
            
                org.springframework.boot
                spring-boot-starter-tomcat
                provided
            
            
          3. 配置入口类,不再使用内嵌服务器

            
                true
                
                -Dfile.encoding=UTF-8
                
                com.baizhi.Springboot06Application
                true
            
            
            // SpringBootServletInitializer:不在使用内嵌容器启动,使用外部tomact启动
            @SpringBootApplication
            public class Springboot06Application extends SpringBootServletInitializer {
                @Override
                protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
                    return builder.sources(Springboot06Application.class);
                }
            
          4. 在maven里进行打包操作

            Spring Boot学习随笔- 拦截器实现和配置(HandlerInterceptor、addInterceptors)、jar包部署和war包部署,第3张

          5. 打包后以后

            Spring Boot学习随笔- 拦截器实现和配置(HandlerInterceptor、addInterceptors)、jar包部署和war包部署,第4张

          6. 在tomcat运行war包项目

            1. 将WAR文件复制到webapps目录

            2. 启动Tomcat服务器

              # 进入Tomcat的bin目录
              cd $CATALINA_HOME/bin
              # 启动Tomcat服务器
              ./startup.sh
              
            3. 访问应用程序:http://localhost:8080/springboot06

          jar包部署【推荐】

          1. 执行在maven执行**package**进行打包

          2. 通过控制台打开jar包目录

            Spring Boot学习随笔- 拦截器实现和配置(HandlerInterceptor、addInterceptors)、jar包部署和war包部署,第5张

          3. 启动jar包

            **java -jar jar文件名 nohub &** 解释:nohub:后台启动 &:不要日志

          4. 成功启动

            Spring Boot学习随笔- 拦截器实现和配置(HandlerInterceptor、addInterceptors)、jar包部署和war包部署,第6张

          • 注意:打包jsp模板时,pom.xml里面必须使用1.4.2插件(plugin)
          • 下一章:Spring Boot学习随笔- 第一个Thymeleaf应用(基础语法th:,request、session作用域取值)