本文共 4603 字,大约阅读时间需要 15 分钟。
Spring Boot通过集成嵌入式Web服务器(如Tomcat)来支持HTTP请求。默认配置下,Spring Boot会启动一个嵌入式的Tomcat服务器,处理所有HTTP请求。
启动Spring Boot应用的主要方式是通过SpringApplication.run()方法。这种方式通常用于开发环境中。例如:
@SpringBootApplicationpublic class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); }} 当HTTP请求到达时,请求会被Tomcat接收并传递给Spring Boot。请求会经过以下几个步骤:
Spring Boot使用HandlerMapping来映射URL到处理方法。HandlerMapping通过以下步骤进行URL匹配:
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 参数:用于获取多个参数值。
@RestControllerpublic class HiController { @RequestBody Map parameters; public String hi() { return parameters.get("name"); }} HTTP头的处理可以通过以下注解进行:
@RestControllerpublic 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; }} Spring Boot支持通过@ControllerAdvice自定义全局异常处理器。例如:
@ControllerAdviceclass GlobalExceptionHandling { @ExceptionHandler(Exception.class) public String handleException(Exception e) { return "发生异常:" + e.getMessage(); }} 过滤器可以通过@WebFilter注解注册,并通过FilterRegistrationBean来配置:
@WebFilter(urlPatterns = "/*")public class TimeCostFilter implements Filter { public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException { chain.doFilter(request, response); }} 默认情况下,404异常不会被Spring Boot的异常处理器处理。要启用异常处理,可以在启动类中添加以下配置:
@SpringBootApplicationpublic class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); }} 或者在配置类中添加:
spring.mvc.throwExceptionIfNoHandlerFound=true
Spring Boot会将多个参数使用逗号分隔,自动转换为数组:
@RequestMapping(path = "hi", method = RequestMethod.GET)public String hi(@RequestParam(value = "names", required = false) String... names) { return Arrays.toString(names);} Spring Boot默认使用Tomcat作为嵌入式Web服务器。通过以下方式可以使用Tomcat:
@SpringBootApplicationpublic class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); }} Tomcat启动时会回调selfInitialize方法,用于注册必要的过滤器和初始化配置。
过滤器的执行顺序可以通过FilterRegistrationBean的setOrder方法来配置:
@Configurationpublic class FilterConfig { @Bean public FilterRegistrationBean timeCostFilter() { FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setFilter(new TimeCostFilter()); registration.addUrlPatterns("/*"); registration.setOrder(1); return registration; }} 通过以上配置,过滤器将按照定义的顺序执行。
如果需要确保过滤器只执行一次,可以继承OncePerRequestFilter:
@Componentpublic class DemoFilter extends OncePerRequestFilter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException { chain.doFilter(request, response); }} 如果@ControllerAdvice注解的异常处理器未被调用,可能是因为HandlerExceptionResolver未能正确注册。可以通过以下方式检查:
@SpringBootApplicationpublic class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); }} 如果过滤器顺序不正确,可以通过@Order注解自定义顺序:
@WebFilter(order = 2)public class AuthFilter implements Filter { public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException { chain.doFilter(request, response); }} 如果URL匹配不成功,可能是因为@RequestMapping注解的路径不正确。可以通过检查路径是否正确或添加@PathVariable来进行调试。
如果参数转换有问题,可以检查@RequestBody或@RequestParam的注解是否正确使用,或者检查参数类型是否正确。
通过以上配置,Spring Boot可以方便地处理HTTP请求,配置过滤器和异常处理器,确保应用的高效运行。通过合理配置,可以优化过滤器顺序和处理流程,确保应用的稳定性和性能。
转载地址:http://sdvfk.baihongyu.com/