Spring Boot 的 Web 应用程序开发

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Boot 的 Web 应用程序开发相关的知识,希望对你有一定的参考价值。

Spring Boot 非常适合 Web 应用程序开发。您可以使用嵌入式 Tomcat、Jetty、Undertow 或 Netty 创建一个自包含的 HTTP 服务器。大多数 Web 应用程序使用该​​spring-boot-starter-web​​​模块来快速启动和运行。您还可以选择使用该​​spring-boot-starter-webflux​​模块构建反应式 Web 应用程序。

Spring

如果您还没有开发过 Spring Boot Web 应用程序,可以关注“Hello World!” ​入门​部分中的示例。

1. Servlet Web 应用程序

如果您想构建基于 servlet 的 Web 应用程序,您可以利用 Spring Boot 的 Spring MVC 或 Jersey 自动配置。

1.1“Spring Web MVC 框架”

Spring Web MVC 框架(通常称为“Spring MVC”)是一个丰富的“模型视图控制器”Web 框架。Spring MVC 允许您创建特殊的​​@Controller​​或​​@RestController​​bean 来处理传入的 HTTP 请求。控制器中的方法通过使用​​@RequestMapping​​注解映射到 HTTP。

以下代码显示了一个典型​​@RestController​​的提供 JSON 数据的代码:

@RestController
@RequestMapping("/users")
public class MyRestController

private final UserRepository userRepository;

private final CustomerRepository customerRepository;

public MyRestController(UserRepository userRepository, CustomerRepository customerRepository)
this.userRepository = userRepository;
this.customerRepository = customerRepository;


@GetMapping("/userId")
public User getUser(@PathVariable Long userId)
return this.userRepository.findById(userId).get();


@GetMapping("/userId/customers")
public List<Customer> getUserCustomers(@PathVariable Long userId)
return this.userRepository.findById(userId).map(this.customerRepository::findByUser).get();


@DeleteMapping("/userId")
public void deleteUser(@PathVariable Long userId)
this.userRepository.deleteById(userId);


功能变体“WebMvc.fn”将路由配置与请求的实际处理分开,如下例所示:

@Configuration(proxyBeanMethods = false)
public class MyRoutingConfiguration

private static final RequestPredicate ACCEPT_JSON = accept(MediaType.APPLICATION_JSON);

@Bean
public RouterFunction<ServerResponse> routerFunction(MyUserHandler userHandler)
return route()
.GET("/user", ACCEPT_JSON, userHandler::getUser)
.GET("/user/customers", ACCEPT_JSON, userHandler::getUserCustomers)
.DELETE("/user", ACCEPT_JSON, userHandler::deleteUser)
.build();


@Component
public class MyUserHandler

public ServerResponse getUser(ServerRequest request)
...
return ServerResponse.ok().build();


public ServerResponse getUserCustomers(ServerRequest request)
...
return ServerResponse.ok().build();


public ServerResponse deleteUser(ServerRequest request)
...
return ServerResponse.ok().build();


Spring MVC 是核心 Spring Framework 的一部分,详细信息可在参考文档中找到。spring.io/guides上还有一些涵盖 Spring MVC 的指南。

1.1.1Spring MVC 自动配置

Spring Boot 为 Spring MVC 提供了自动配置,适用于大多数应用程序。

自动配置在 Spring 的默认值之上添加了以下特性:

  • 包括ContentNegotiatingViewResolverBeanNameViewResolver豆类。
  • 支持提供静态资源,包括对 WebJars 的支持(本文档后面会介绍)。
  • 自动注册ConverterGenericConverterFormatterbean。
  • 支持HttpMessageConverters(本文档稍后介绍)。
  • 自动注册MessageCodesResolver(本文档稍后介绍)。
  • 静态index.html支持。
  • ​ConfigurableWebBindingInitializer​​bean的自动使用(本文档稍后会介绍)。

如果您想保留那些 Spring Boot MVC 自定义并进行更多MVC 自定义(拦截器、格式化程序、视图控制器和其他功能),您可以添加自己​​@Configuration​​的类型类​​WebMvcConfigurer​​但 ​​@EnableWebMvc​​添加.

如果您想提供、 或的自定义实例​​RequestMappingHandlerMapping​​,并且仍然保留 Spring Boot MVC 自定义,则可以声明一个类型的 bean并使用它来提供这些组件的自定义实例。​​RequestMappingHandlerAdapter​​​​ExceptionHandlerExceptionResolver​​​​WebMvcRegistrations​

如果你想完全控制 Spring MVC,你可以添加你自己的​​@Configuration​​注释​​@EnableWebMvc​​,或者添加你自己的​​@Configuration​​-annotated ​​DelegatingWebMvcConfiguration​​,如​​@EnableWebMvc​​.

1.1.2HttpMessage转换器

Spring MVC 使用该​​HttpMessageConverter​​接口来转换 HTTP 请求和响应。明智的默认设置是开箱即用的。例如,对象可以自动转换为 JSON(通过使用 Jackson 库)或 XML(通过使用 Jackson XML 扩展,如果可用,或者通过使用 JAXB,如果 Jackson XML 扩展不可用)。默认情况下,字符串以​​UTF-8​​.

如果需要添加或自定义转换器,可以使用 Spring Boot 的​​HttpMessageConverters​​类,如下清单所示:

@Configuration(proxyBeanMethods = false)
public class MyHttpMessageConvertersConfiguration

@Bean
public HttpMessageConverters customConverters()
HttpMessageConverter<?> additional = new AdditionalHttpMessageConverter();
HttpMessageConverter<?> another = new AnotherHttpMessageConverter();
return new HttpMessageConverters(additional, another);


​HttpMessageConverter​​上下文中存在的任何bean 都将添加到转换器列表中。您也可以以相同的方式覆盖默认转换器。

1.1.3MessageCodesResolver

Spring MVC 有一个生成错误代码的策略,用于从绑定错误中呈现错误消息:​​MessageCodesResolver​​. 如果您设置​​spring.mvc.message-codes-resolver-format​​属性​​PREFIX_ERROR_CODE​​或​​POSTFIX_ERROR_CODE​​,Spring Boot 会为您创建一个(请参阅 中的枚举DefaultMessageCodesResolver.Format)。

1.1.4静态内容

默认情况下,Spring Boot 从类路径中名为​​/static​​(或​​/public​​或​​/resources​​或​​/META-INF/resources​​)的目录或从​​ServletContext​​. 它使用​​ResourceHttpRequestHandler​​来自 Spring MVC 的方法,因此您可以通过添加自己的方法​​WebMvcConfigurer​​并覆盖该​​addResourceHandlers​​方法来修改该行为。

在独立的 Web 应用程序中,容器中的默认 servlet 未启用。可以使用该​​server.servlet.register-default-servlet​​属性启用它。

默认 servlet 充当后备,​​ServletContext​​如果 Spring 决定不处理它,则从根目录提供内容。大多数情况下,这不会发生(除非你修改了默认的 MVC 配置),因为 Spring 总是可以通过​​DispatcherServlet​​.

默认情况下,资源映射在 上​​/**​​,但您可以使用该​​spring.mvc.static-path-pattern​​属性对其进行调整。例如,将所有资源重新定位到​​/resources/**​​可以实现如下:

spring.mvc.static-path-pattern=/resources/**

您还可以使用该​​spring.web.resources.static-locations​​属性自定义静态资源位置(将默认值替换为目录位置列表)。根 servlet 上下文路径​​"/"​​也会自动添加为位置。

除了前面提到的“标准”静态资源位置之外,还为Webjars 内容做了一个特殊情况。​​/webjars/**​​如果以 Webjars 格式打包,则任何具有路径的资源都将从 jar 文件中提供。

Spring Boot 还支持 Spring MVC 提供的高级资源处理功能,允许使用诸如缓存清除静态资源或为 Webjar 使用与版本无关的 URL 等用例。

要为 Webjar 使用与版本无关的 URL,请添加​​webjars-locator-core​​​依赖项。然后声明你的 Webjar。以jQuery为例,添加​​"/webjars/jquery/jquery.min.js"​​​结果在​​"/webjars/jquery/x.y.z/jquery.min.js"​​​哪里​​x.y.z​​是Webjar版本。

要使用缓存清除,以下配置为所有静态资源配置缓存清除解决方案,有效地在 URL 中添加内容哈希,例如​​<link href="/css/spring-2a2d595e6ed9a0b24f027f2b63b134d6.css"/>​​:

特性

spring.web.resources.chain.strategy.content.enabled=true
spring.web.resources.chain.strategy.content.paths=/**

例如,当使用 javascript 模块加载器动态加载资源时,重命名文件不是一种选择。这就是为什么还支持其他策略并且可以组合的原因。“固定”策略在 URL 中添加静态版本字符串而不更改文件名,如下例所示:

特性

spring.web.resources.chain.strategy.content.enabled=true
spring.web.resources.chain.strategy.content.paths=/**
spring.web.resources.chain.strategy.fixed.enabled=true
spring.web.resources.chain.strategy.fixed.paths=/js/lib/
spring.web.resources.chain.strategy.fixed.version=v12

使用此配置,位于下的 JavaScript 模块​​"/js/lib/"​​使用固定版本控制策略 ( ​​"/v12/js/lib/mymodule.js"​​),而其他资源仍使用内容策略 ( ​​<link href="/css/spring-2a2d595e6ed9a0b24f027f2b63b134d6.css"/>​​)。

有关WebProperties.Resources更多支持的选项,请参阅。

1.1.5欢迎页面

Spring Boot 支持静态和模板化的欢迎页面。​​index.html​​它首先在配置的静态内容位置中查找文件。如果没有找到,它会寻找一个​​index​​模板。如果找到其中任何一个,它会自动用作应用程序的欢迎页面。

1.1.6自定义网站图标

与其他静态资源一样,Spring Boot​​favicon.ico​​在配置的静态内容位置中检查 a。如果存在这样的文件,它会自动用作应用程序的图标。

1.1.7路径匹配和内容协商

Spring MVC 可以通过查看请求路径并将其与应用程序中定义的映射匹配(例如,​​@GetMapping​​控制器方法上的注释)将传入的 HTTP 请求映射到处理程序。

Spring Boot 默认选择禁用后缀模式匹配,这意味着 like 的请求​​"GET /projects/spring-boot.json"​​不会匹配到​​@GetMapping("/projects/spring-boot")​​映射。这被认为是Spring MVC 应用程序的最佳实践。过去,此功能主要对未发送正确“Accept”请求标头的 HTTP 客户端有用;我们需要确保向客户端发送正确的内容类型。如今,内容协商更加可靠。

还有其他方法可以处理不能始终发送正确的“接受”请求标头的 HTTP 客户端。我们可以不使用后缀匹配,而是使用查询参数来确保请求 like​​"GET /projects/spring-boot?format=json"​​将被映射到​​@GetMapping("/projects/spring-boot")​​:

特性

spring.mvc.contentnegotiation.favor-parameter=true

或者,如果您更喜欢使用不同的参数名称:

特性

spring.mvc.contentnegotiation.favor-parameter=true
spring.mvc.contentnegotiation.parameter-name=myparam

大多数标准媒体类型都支持开箱即用,但您也可以定义新的媒体类型:

特性

spring.mvc.contentnegotiation.media-types.markdown=text/markdown

后缀模式匹配已弃用,并将在未来版本中删除。如果您了解这些警告并且仍然希望您的应用程序使用后缀模式匹配,则需要以下配置:

特性

spring.mvc.contentnegotiation.favor-path-extension=true
spring.mvc.pathmatch.use-suffix-pattern=true

或者,与其打开所有后缀模式,不如只支持已注册的后缀模式更安全:

特性

spring.mvc.contentnegotiation.favor-path-extension=true
spring.mvc.pathmatch.use-registered-suffix-pattern=true

从 Spring Framework 5.3 开始,Spring MVC 支持多种实现策略,用于将请求路径匹配到 Controller 处理程序。它以前只支持该​​AntPathMatcher​​策略,但现在它也提供​​PathPatternParser​​. Spring Boot 现在提供了一个配置属性来选择和选择新策略:

特性

spring.mvc.pathmatch.matching-strategy=path-pattern-parser

有关为什么应该考虑这个新实现的更多详细信息,请参阅 专门的博客文章。

1.1.8ConfigurableWebBindingInitializer

Spring MVC 使用 a来为特定请求​​WebBindingInitializer​​初始化 a 。​​WebDataBinder​​如果你自己创建​​ConfigurableWebBindingInitializer​​ ​​@Bean​​,Spring Boot 会自动配置 Spring MVC 来使用它。

1.1.9模板引擎

除了 REST Web 服务,您还可以使用 Spring MVC 来提供动态 HTML 内容。Spring MVC 支持多种模板技术,包括 Thymeleaf、FreeMarker 和 JSP。此外,许多其他模板引擎包括他们自己的 Spring MVC 集成。

Spring Boot 包括对以下模板引擎的自动配置支持:

  • 自由标记
  • 时髦的
  • 百里香叶
  • 胡子

当您将这些模板引擎之一与默认配置一起使用时,您的模板会自动从​​src/main/resources/templates​​.

1.1.10错误处理

默认情况下,Spring Boot 提供了一个​​/error​​以合理方式处理所有错误的映射,并将其注册为 servlet 容器中的“全局”错误页面。对于机器客户端,它会生成一个 JSON 响应,其中包含错误、HTTP 状态和异常消息的详细信息。对于浏览器客户端,有一个“whitelabel”错误视图,它以 HTML 格式呈现相同的数据(要自定义它,添加一个​​View​​解析为 的​​error​​)。

​server.error​​如果要自定义默认错误处理行为,可以设置许多属性。请参阅附录的“服务器属性”部分。

要完全替换默认行为,您可以实现​​ErrorController​​并注册该类型的 bean 定义或添加类型的 bean​​ErrorAttributes​​以使用现有机制但替换内容。

您还可以定义一个带有注释的类​​@ControllerAdvice​​来自定义 JSON 文档以返回特定控制器和/或异常类型,如以下示例所示:

爪哇

科特林

@ControllerAdvice(basePackageClasses = SomeController.class)
public class MyControllerAdvice extends ResponseEntityExceptionHandler

@ResponseBody
@ExceptionHandler(MyException.class)
public ResponseEntity<?> handleControllerException(HttpServletRequest request, Throwable ex)
HttpStatus status = getStatus(request);
return new ResponseEntity<>(new MyErrorBody(status.value(), ex.getMessage()), status);


private HttpStatus getStatus(HttpServletRequest request)
Integer code = (Integer) request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE);
HttpStatus status = HttpStatus.resolve(code);
return (status != null) ? status : HttpStatus.INTERNAL_SERVER_ERROR;


在前面的示例中,如果​​MyException​​由与 相同的包中定义的控制器抛出,则使用 POJO​​SomeController​​的 JSON 表示​​MyErrorBody​​而不是​​ErrorAttributes​​表示。

在某些情况下,在控制器级别处理的错误不会被度量基础设施记录。应用程序可以通过将处理的异常设置为请求属性来确保将此类异常与请求指标一起记录:

@Controller
public class MyController

@ExceptionHandler(CustomException.class)
String handleCustomException(HttpServletRequest request, CustomException ex)
request.setAttribute(ErrorAttributes.ERROR_ATTRIBUTE, ex);
return "errorView";


自定义错误页面

如果要显示给定状态代码的自定义 HTML 错误页面,可以将文件添加到​​/error​​目录。错误页面可以是静态 HTML(即添加到任何静态资源目录下),也可以使用模板构建。文件名应该是准确的状态码或序列掩码。

例如,要映射​​404​​到静态 HTML 文件,您的目录结构如下:

src/ 
+- main/
+- java/
| + <源代码>
+- 资源/
+- 公共/
+- 错误/
| +- 404.html
+- <其他公共资产>

要使用 FreeMarker 模板映射所有​​5xx​​错误,您的目录结构如下:

src/ 
+- main/
+- java/
| + <源代码>
+- 资源/
+- 模板/
+- 错误/
| +- 5xx.ftlh
+- <其他模板>

对于更复杂的映射,您还可以添加实现​​ErrorViewResolver​​接口的 bean,如下例所示:

public class MyErrorViewResolver implements ErrorViewResolver 

@Override
public ModelAndView resolveErrorView(HttpServletRequest request, HttpStatus status, Map<String, Object> model)
// Use the request or status to optionally return a ModelAndView
if (status == HttpStatus.INSUFFICIENT_STORAGE)
// We could add custom model values here
new ModelAndView("myview");

return null;


您还可以使用常规 Spring MVC 功能,例如@ExceptionHandler方法和@ControllerAdvice. 然后​​ErrorController​​拾取任何未处理的异常。

在 Spring MVC 之外映射错误页面

对于不使用 Spring MVC 的应用,可以使用​​ErrorPageRegistrar​​接口直接注册​​ErrorPages​​。这种抽象直接与底层的嵌入式 servlet 容器一起工作,即使您没有 Spring MVC 也可以工作​​DispatcherServlet​​。

@Configuration(proxyBeanMethods = false)
public class MyErrorPagesConfiguration

@Bean
public ErrorPageRegistrar errorPageRegistrar()
return this::registerErrorPages;


private void registerErrorPages(ErrorPageRegistry registry)
registry.addErrorPages(new ErrorPage(HttpStatus.BAD_REQUEST, "/400"));


爪哇

科特林

@Configuration(proxyBeanMethods = false)
public class MyFilterConfiguration

@Bean
public FilterRegistrationBean<MyFilter> myFilter()
FilterRegistrationBean<MyFilter> registration = new FilterRegistrationBean<>(new MyFilter());
// ...
registration.setDispatcherTypes(EnumSet.allOf(DispatcherType.class));
return registration;


请注意,默认值​​FilterRegistrationBean​​不包括​​ERROR​​调度程序类型。

WAR 部署中的错误处理

当部署到 servlet 容器时,Spring Boot 使用其错误页面过滤器将具有错误状态的请求转发到相应的错误页面。这是必要的,因为 servlet 规范不提供用于注册错误页面的 API。根据您将 war 文件部署到的容器以及您的应用程序使用的技术,可能需要一些额外的配置。

如果响应尚未提交,错误页面过滤器只能将请求转发到正确的错误页面。默认情况下,WebSphere Application Server 8.0 和更高版本在成功完成 servlet 的服务方法时提交响应。​​com.ibm.ws.webcontainer.invokeFlushAfterService​​您应该通过设置来禁用此行为​​false​​。

如果您使用 Spring Security 并希望在错误页面中访问主体,则必须配置 Spring Security 的过滤器以在错误调度时调用。为此,请将​​spring.security.filter.dispatcher-types​​属性设置为​​async, error, forward, request​​。

1.1.11CORS 支持

跨域资源共享(CORS) 是大多数浏览器实现的W3C 规范,它允许您以灵活的方式指定授权哪种跨域请求,而不是使用 IFRAME 或 JSONP 等一些不太安全和不太强大的方法。

从 4.2 版开始,Spring MVC支持 CORS。在 Spring Boot 应用程序中使用带有注释的控制器方法 CORS 配置@CrossOrigin不需要任何特定配置。 可以通过使用自定义方法注册 bean来定义全局 CORS 配置,如下例所示:​​WebMvcConfigurer​​​​addCorsMappings(CorsRegistry)​

@Configuration(proxyBeanMethods = false)
public class MyCorsConfiguration

@Bean
public WebMvcConfigurer corsConfigurer()
return new WebMvcConfigurer()

@Override
public void addCorsMappings(CorsRegistry registry)
registry.addMapping("/api/**");


;


1.2. JAX-RS 和泽西岛

如果您更喜欢 REST 端点的 JAX-RS 编程模型,则可以使用其中一种可用的实现来代替 Spring MVC。 Jersey和Apache CXF开箱即用,效果很好。CXF 要求您在应用程序上下文中将其​​Servlet​​或注册​​Filter​​为 a 。​​@Bean​​Jersey 有一些原生的 Spring 支持,所以我们还在 Spring Boot 中为它提供了自动配置支持,以及一个 starter。

要开始使用 Jersey,请包含​​spring-boot-starter-jersey​​作为依赖项,然后您需要一种​​@Bean​​类型​​ResourceConfig​​,您可以在其中注册所有端点,如以下示例所示:

@Component
public class MyJerseyConfig extends ResourceConfig

public MyJerseyConfig()
register(MyEndpoint.class);


对于更高级的自定义,您还可以注册任意数量的实现​​ResourceConfigCustomizer​​.

所有注册的端点都应该​​@Components​​带有 HTTP 资源注释(​​@GET​​和其他),如以下示例所示:

@Component
@Path("/hello")
public class MyEndpoint

@GET
public String message()
return "Hello";


由于​​Endpoint​​是 Spring ​​@Component​​,其生命周期由 Spring 管理,您可以使用​​@Autowired​​注解注入依赖项并使用​​@Value​​注解注入外部配置。默认情况下,Jersey servlet 已注册并映射到​​/*​​. 您可以通过添加​​@ApplicationPath​​到您的​​ResourceConfig​​.

默认情况下,Jersey 设置为名为​​@Bean​​的类型的 servlet 。默认情况下,servlet 是延迟初始化的,但您可以通过设置来自定义该行为。您可以通过创建自己的同名 bean 来禁用或覆盖该 bean。您还可以通过设置使用过滤器而不是 servlet (在这种情况下,要替换或覆盖的是)。过滤器有一个,您可以使用 进行设置。当使用 Jersey 作为过滤器时,必须存在一个处理任何未被 Jersey 拦截的请求的 servlet。如果您的应用程序不包含这样的 servlet,您可能希望通过设置来启用默认 servlet​​ServletRegistrationBean​​​​jerseyServletRegistration​​​​spring.jersey.servlet.load-on-startup​​​​spring.jersey.type=filter​​​​@Bean​​​​jerseyFilterRegistration​​​​@Order​​​​spring.jersey.filter.order​​​​server.servlet.register-default-servlet​​​​true​​. servlet 和过滤器注册都可以通过使用​​spring.jersey.init.*​​指定属性映射来指定初始化参数。

1.3. 嵌入式 Servlet 容器支持

对于 servlet 应用程序,Spring Boot 包括对嵌入式Tomcat、Jetty和Undertow服务器的支持。大多数开发人员使用适当的“Starter”来获取完全配置的实例。默认情况下,嵌入式服务器在 port 上侦听 HTTP 请求​​8080​​。

1.3.1Servlet、过滤器和侦听器

使用嵌入式 servlet 容器时,您可以通过使用 Spring beans 或扫描 servlet 组件来注册 servlet、过滤器和 servlet 规范中的所有侦听器(例如​​HttpSessionListener​​)。

将 Servlet、过滤器和侦听器注册为 Spring Bean

任何作为 Spring bean 的​​Servlet​​、​​Filter​​或 servlet​​*Listener​​实例都会在嵌入式容器中注册。如果您想​​application.properties​​在配置期间引用一个值,这会特别方便。

默认情况下,如果上下文只包含一个 Servlet,它会映射到​​/​​. 在多个 servlet bean 的情况下,bean 名称用作路径前缀。过滤器映射到​​/*​​.

如果基于约定的映射不够灵活,您可以使用​​ServletRegistrationBean​​、​​FilterRegistrationBean​​和​​ServletListenerRegistrationBean​​类进行完全控制。

让过滤器豆无序通常是安全的。如果需要特定的顺序,您应该使用注释​​Filter​​或​​@Order​​使其实现​​Ordered​​。您不能通过使用​​Filter​​注释其 bean 方法来配置 a 的顺序​​@Order​​。如果您无法更改​​Filter​​要添加​​@Order​​或实现的类​​Ordered​​,则必须​​FilterRegistrationBean​​为定义一个并使用该方法​​Filter​​设置注册 bean 的顺序。​​setOrder(int)​​避免在 处配置读取请求正文的过滤器​​Ordered.HIGHEST_PRECEDENCE​​,因为它可能会违反应用程序的字符编码配置。如果 servlet 过滤器包装了请求,则应使用小于或等于 的顺序对其进行配置​​OrderedFilter.REQUEST_WRAPPER_FILTER_MAX_ORDER​​。

1.3.2. Servlet 上下文初始化

嵌入式 servlet 容器不直接执行 servlet 3.0+​​javax.servlet.ServletContainerInitializer​​接口或 Spring 的​​org.springframework.web.WebApplicationInitializer​​接口。这是一个有意的设计决策,旨在降低设计为在战争中运行的第三方库可能会破坏 Spring Boot 应用程序的风险。

如果您需要在 Spring Boot 应用程序中执行 servlet 上下文初始化,您应该注册一个实现该​​org.springframework.boot.web.servlet.ServletContextInitializer​​接口的 bean。单一​​onStartup​​方法提供对 的访问,​​ServletContext​​并且如有必要,可以轻松地用作现有​​WebApplicationInitializer​​.

扫描 Servlet、过滤器和侦听器

使用嵌入式容器时,使用 、 和 注释的类的自动​​@WebServlet​​​注册​​@WebFilter​​​可以​​@WebListener​​​使用​​@ServletComponentScan​​.

1.3.3. ServletWebServerApplicationContext

在底层,Spring Boot 使用不同类型的​​ApplicationContext​​​嵌入式 servlet 容器支持。这是一种通过搜索单个bean来引导自身​​ServletWebServerApplicationContext​​​的特殊类型。通常 a 、或已自动配置。​​WebApplicationContext​​​​ServletWebServerFactory​​​​TomcatServletWebServerFactory​​​​JettyServletWebServerFactory​​​​UndertowServletWebServerFactory​

在嵌入式容器设置中,​​ServletContext​​​设置为在应用程序上下文初始化期间发生的服务器启动的一部分。因为这个 bean​​ApplicationContext​​​不能用​​ServletContext​​​. 解决此问题的一种方法是将注入​​ApplicationContext​​​作为 bean 的依赖项并​​ServletContext​​​仅在需要时访问。另一种方法是在服务器启动后使用回调。这可以使用​​ApplicationListener​​​如下来完成​​ApplicationStartedEvent​​:

public class MyDemoBean implements ApplicationListener<ApplicationStartedEvent> 

private ServletContext servletContext;

@Override
public void onApplicationEvent(ApplicationStartedEvent event)
ApplicationContext applicationContext = event.getApplicationContext();
this.servletContext = ((WebApplicationContext) applicationContext).getServletContext();


1.3.4定制嵌入式 Servlet 容器

可以使用 Spring​​Environment​​属性配置常见的 servlet 容器设置。通常,您会在​​application.properties​​or​​application.yaml​​文件中定义属性。

常见的服务器设置包括:

  • 网络设置:监听传入 HTTP 请求的端口 ( server.port)、要绑定的接口地址server.address等。
  • 会话设置:会话是否持久(server.servlet.session.persistent)、会话超时(server.servlet.session.timeout)、会话数据的位置(server.servlet.session.store-dir)和会话cookie配置(server.servlet.session.cookie.*)。
  • 错误管理:错误页面的位置(server.error.path)等。
  • SSL
  • HTTP 压缩

Spring Boot 尽可能地尝试公开常用设置,但这并不总是可能的。对于这些情况,专用命名空间提供特定于服务器的定制(请参阅​​server.tomcat​​​和​​server.undertow​​)。例如,可以使用嵌入式 servlet 容器的特定功能配置访问日志。

SameSite Cookie

Web 浏览器可以使用​​SameSite​​cookie 属性来控制是否以及如何在跨站点请求中提交 cookie。该属性与现代 Web 浏览器特别相关,这些浏览器已开始更改缺少该属性时使用的默认值。

如果要更改​​SameSite​​会话 cookie 的属性,可以使用该​​server.servlet.session.cookie.same-site​​属性。自动配置的 Tomcat、Jetty 和 Undertow 服务器支持此属性。它还用于配置基于 Spring Session servlet 的​​SessionRepository​​bean。

例如,如果您希望会话 cookie 具有​​SameSite​​属性​​None​​,您可以将以下内容添加到您的​​application.properties​​or​​application.yaml​​文件中:

特性

server.servlet.session.cookie.same-site=none

如果您想更改​​SameSite​​添加到您的其他 cookie 上的属性​​HttpServletResponse​​,您可以使用​​CookieSameSiteSupplier​​. ​​CookieSameSiteSupplier​​传递了一个并且​​Cookie​​可能返回一个​​SameSite​​值,或者​​null​​。

您可以使用许多便利工厂和过滤方法来快速匹配特定的 cookie。例如,添加以下 bean 将自动

以上是关于Spring Boot 的 Web 应用程序开发的主要内容,如果未能解决你的问题,请参考以下文章

一个依赖搞定 Spring Boot 反爬虫,防止接口盗刷!

Spring Boot 的 Web 应用程序开发

Spring Boot开发Web应用之Thymeleaf篇

从其他实体检索ID时的Spring Boot JPA反序列化问题

使用 Spring Boot webclient 反序列化 OffsetDateTime

Spring Boot开发Web应用