博客
关于我
spring编程常见错误二 (学习笔记)
阅读量:797 次
发布时间:2023-02-26

本文共 4603 字,大约阅读时间需要 15 分钟。

Spring Boot 过程调试指南

1. HTTP 请求处理基础

Spring Boot通过集成嵌入式Web服务器(如Tomcat)来支持HTTP请求。默认配置下,Spring Boot会启动一个嵌入式的Tomcat服务器,处理所有HTTP请求。

1.1 启动应用

启动Spring Boot应用的主要方式是通过SpringApplication.run()方法。这种方式通常用于开发环境中。例如:

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

1.2 HTTP 请求处理流程

当HTTP请求到达时,请求会被Tomcat接收并传递给Spring Boot。请求会经过以下几个步骤:

  • 接收请求:Tomcat使用NIOEndpoint的Poller轮询接收新的连接。
  • 处理请求:请求会被分解并传递到线程池进行处理。
  • 路由请求:DispatcherServlet将请求路由到对应的Controller方法。
  • 响应处理:处理完成后,响应会被构建并发送回客户端。
  • 1.3 URL 匹配

    Spring Boot使用HandlerMapping来映射URL到处理方法。HandlerMapping通过以下步骤进行URL匹配:

  • 精准匹配:首先尝试精准匹配URL路径。如果匹配成功,直接调用对应的处理方法。
  • 扩展匹配:如果精准匹配未成功,尝试根据请求方法和路径进行扩展匹配。
  • 1.4 参数处理

    Spring Boot支持多种参数注解:

    • @RequestParam:用于获取请求参数,支持设置默认值和是否必填。

      @RequestMapping(path = "hi", method = RequestMethod.GET)
      public String hi(@RequestParam(value = "name", defaultValue = "world") String name) {
      return name;
      }
    • @RequestBody:用于自动解析请求体到对象。

      @RestController
      @RequestMapping(path = "hi", method = RequestMethod.POST)
      public class HiController {
      @RequestBody SomeObject someObject;
      public String hi() {
      return someObject.getName();
      }
      }
    • @RequestParam Map 参数:用于获取多个参数值。

      @RestController
      public class HiController {
      @RequestBody Map
      parameters;
      public String hi() {
      return parameters.get("name");
      }
      }

    1.5 处理HTTP头

    HTTP头的处理可以通过以下注解进行:

    • @RequestHeader:用于获取特定头信息。
      @RestController
      public class HiController {
      @RequestHeader(name = "Content-Type", required = false)
      String contentType;
      @RequestHeader(name = "User-Agent")
      String userAgent;
      public String hi() {
      return "Content-Type: " + contentType + "\nUser-Agent: " + userAgent;
      }
      }

    1.6 异常处理

    Spring Boot支持通过@ControllerAdvice自定义全局异常处理器。例如:

    @ControllerAdvice
    class GlobalExceptionHandling {
    @ExceptionHandler(Exception.class)
    public String handleException(Exception e) {
    return "发生异常:" + e.getMessage();
    }
    }

    1.7 过滤器配置

    过滤器可以通过@WebFilter注解注册,并通过FilterRegistrationBean来配置:

    @WebFilter(urlPatterns = "/*")
    public class TimeCostFilter implements Filter {
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException {
    chain.doFilter(request, response);
    }
    }

    1.8 URL 404 不处理

    默认情况下,404异常不会被Spring Boot的异常处理器处理。要启用异常处理,可以在启动类中添加以下配置:

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

    或者在配置类中添加:

    spring.mvc.throwExceptionIfNoHandlerFound=true

    1.9 GET 请求参数传递

    Spring Boot会将多个参数使用逗号分隔,自动转换为数组:

    @RequestMapping(path = "hi", method = RequestMethod.GET)
    public String hi(@RequestParam(value = "names", required = false) String... names) {
    return Arrays.toString(names);
    }

    1.10 集成Tomcat

    Spring Boot默认使用Tomcat作为嵌入式Web服务器。通过以下方式可以使用Tomcat:

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

    Tomcat启动时会回调selfInitialize方法,用于注册必要的过滤器和初始化配置。

    1.11 过滤器顺序

    过滤器的执行顺序可以通过FilterRegistrationBeansetOrder方法来配置:

    @Configuration
    public class FilterConfig {
    @Bean
    public FilterRegistrationBean timeCostFilter() {
    FilterRegistrationBean registration = new FilterRegistrationBean();
    registration.setFilter(new TimeCostFilter());
    registration.addUrlPatterns("/*");
    registration.setOrder(1);
    return registration;
    }
    }

    通过以上配置,过滤器将按照定义的顺序执行。

    2. 常见问题

    2.1 过滤器多次执行

    如果需要确保过滤器只执行一次,可以继承OncePerRequestFilter

    @Component
    public class DemoFilter extends OncePerRequestFilter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException {
    chain.doFilter(request, response);
    }
    }

    2.2 异常处理器不被调用

    如果@ControllerAdvice注解的异常处理器未被调用,可能是因为HandlerExceptionResolver未能正确注册。可以通过以下方式检查:

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

    2.3 过滤器顺序配置

    如果过滤器顺序不正确,可以通过@Order注解自定义顺序:

    @WebFilter(order = 2)
    public class AuthFilter implements Filter {
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException {
    chain.doFilter(request, response);
    }
    }

    2.4 URL 匹配问题

    如果URL匹配不成功,可能是因为@RequestMapping注解的路径不正确。可以通过检查路径是否正确或添加@PathVariable来进行调试。

    2.5 参数转换问题

    如果参数转换有问题,可以检查@RequestBody@RequestParam的注解是否正确使用,或者检查参数类型是否正确。

    3. 总结

    通过以上配置,Spring Boot可以方便地处理HTTP请求,配置过滤器和异常处理器,确保应用的高效运行。通过合理配置,可以优化过滤器顺序和处理流程,确保应用的稳定性和性能。

    转载地址:http://sdvfk.baihongyu.com/

    你可能感兴趣的文章
    OSG学习:纹理映射(二)——一维/二维/简单立方图纹理映射
    查看>>
    OSG学习:纹理映射(五)——计算纹理坐标
    查看>>
    OSG学习:纹理映射(六)——灯光
    查看>>
    OSG学习:纹理映射(四)——三维纹理映射
    查看>>
    OSG:从源码看Viewer::run() 一
    查看>>
    osi 负载均衡
    查看>>
    OSI七层模型与TCP/IP五层模型(转)
    查看>>
    OSI七层模型与TCP/IP四层与五层模型详解
    查看>>
    OSI七层模型的TCP/IP模型都有哪几层和他们的对应关系?
    查看>>
    OSI操作系统(NETBASE第八课)
    查看>>
    OSM数据如何下载使用(地图数据篇.11)
    查看>>
    OSPF 四种设备角色:IR、ABR、BR、ASBR
    查看>>
    OSPF 四种路由类型:Intra Area、Inter Area、第一、二类外部路由
    查看>>
    OSPF 学习
    查看>>
    OSPF 支持的网络类型:广播、NBMA、P2MP和P2P类型
    查看>>
    OSPF 概念型问题
    查看>>
    OSPF 的主要目的是什么?
    查看>>
    OSPF5种报文:Hello报文、DD报文、LSR报文、LSU报文和LSAck报文
    查看>>
    SQL Server 存储过程分页。
    查看>>
    OSPFv3:第三版OSPF除了支持IPv6,还有这些强大的特性!
    查看>>