Spring Boot Версия 2.7.8 原文:https://docs.spring.io/spring-boot/docs/2.7.8/reference/htmlsingle/ —
Spring Boot 3.x первый GA Версия вышла в конце 22, 2.7.8 это 2.x последний GAВерсия,Я думаю, что 2.x по-прежнему будет в центре внимания в течение определенного периода времени.
,Большая часть этой статьи была переведена с помощью программного обеспечения,В сочетании с моим собственным опытом и пониманием организации и аннотирования,глазиз Используется в качестве ручного поискаиинформационная грамотность。 Эта статья в основном о весне Boot ссылкагидсерединаиз“Web
”章节 Недавно я обнаружил сайт,документ также можно перевести как из,Вы можете прочитать здесь позже«Китайская документация Spring Boot»,Следующие главы здесь обновляться не будут. Spring Boot Справочник на китайском языке (1) Справочное руководство Spring Boot на китайском языке (2) — Интернет Spring Boot Китайский справочный справочник (3)-Данные Spring Boot Справочное руководство на китайском языке (4)-Сообщение Spring Boot Справочное руководство на китайском языке (5)-IO Spring Boot Справочное руководство на китайском языке (6) — Образ контейнера Spring Boot Справочное руководство на китайском языке (7) — Готовые к производству функции Spring Boot Справочное руководство на китайском языке (8) – Развертывание Spring Boot Китайский справочник (9) – Весна Boot CLI Spring Boot Справочное руководство на китайском языке (10) — Инструменты сборки Spring Boot Справочное руководство на китайском языке (11)-"Как сделать" гид Spring Boot Справочное руководство на китайском языке(12) – Приложение
Spring Boot Очень подходит для разработки веб-приложений, можно использовать Tomcat, Jetty, Undertow. или Netty как HTTP-сервер,на основеservletизприложение Использование программыspring-boot-starter-web
модуль,ОтзывчивыйизWebприложение Использование программыspring-boot-starter-webflux
。
Если вы хотите создать веб-приложение на основе сервлетов, вы можете использовать Spring Boot Подари весне MVC или ВОЗ Автоматическая конфигурация предоставлена Джерси.
Spring MVC Позволяет создать конкретный @Controller или @RestController Компонент для обработки входящих HTTP-запросов. Методы в контроллере сопоставляются с HTTP с помощью аннотации @RequestMapping`.
В следующем примере показан типичный предоставленный JSON. данныеиз@RestController
пример:
import java.util.List;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@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);
}
}
Автоконфигурация добавляет следующие функции поверх конфигурации Spring по умолчанию:
ContentNegotiatingViewResolver
Bean и BeanNameViewResolver
BeanConverter
、GenericConverter
、Formatter
BeanHttpMessageConverters
(Следовать за介绍)MessageCodesResolver
(Введение последует)index.html
поддерживатьConfigurableWebBindingInitializer
bean (Введение последует)Если вы хотите сохранить эту весну Boot MVC из Пользовательские функции,и выполнять дополнительную настройку MVC (перехватчики, форматирование, контроллеры представлений и т. д.),ты можешь добавить себяизWebMvcConfigurer
типиз@Configuration
добрый,Но не надо добавлять@EnableWebMvc
。
Если вы хотите предоставитьRequestMappingHandlerMapping
、RequestMappingHandlerAdapter
илиExceptionHandlerExceptionResolver
из Пользовательский экземпляр,и сохраните настройки Spring Boot MVC,Вы можете объявитьWebMvcRegistrations
типизbean,И используйте его для предоставления пользовательских экземпляров этих компонентов.
Если вы хотите полный контроль над Spring MVC,Вы можете добавить себяиз@Configuration
использовать@EnableWebMvc
аннотация,илиили добавьте себяиз@Configuration
-annotated DelegatingWebMvcConfiguration
,нравиться@EnableWebMvc
изJavadocсередина所述。
Spring MVC使использоватьизConversionService
与использовать Вотapplication.properties
илиapplication.yaml
документсередина转换ценитьиз Услуги разные。это означаетPeriod
、Duration
иDataSize
转换器不可использовать,@DurationUnit
и@DataSizeUnit
Комментарии будут игнорироваться。
Если вы хотите настроить Spring MVC使использоватьизConversionService
,Может быть предоставлен сaddFormattersметодизWebMvcConfigurer
bean。通过此метод,Вы можете зарегистрировать любой понравившийся вам конвертер,Это также можно делегироватьApplicationConversionService
начальство可использоватьизстатическийметод。
Примечание автора:
Spring MVCавтоматическая конфигурация Зависит отspring-boot-autoconfigure
依赖серединаизWebMvcAutoConfiguration
добрый加载
ContentNegotiatingViewResolver
из Конфигурация
@Bean
@ConditionalOnBean(ViewResolver.class)
@ConditionalOnMissingBean(name = "viewResolver", value = ContentNegotiatingViewResolver.class)
public ContentNegotiatingViewResolver viewResolver(BeanFactory beanFactory) {
ContentNegotiatingViewResolver resolver = new ContentNegotiatingViewResolver();
resolver.setContentNegotiationManager(beanFactory.getBean(ContentNegotiationManager.class));
// ContentNegotiatingViewResolver Используйте другие преобразователи представлений для поиска представлений, поэтому они должны иметь более высокий приоритет.
reso lver.setOrder(Ordered.HIGHEST_PRECEDENCE);
return resolver;
}
ContentNegotiatingViewResolver сам по себе не разрешает представление, а делегирует его другому viewResolver.
BeanNameViewResolver
из Конфигурация
@Bean
@ConditionalOnBean(View.class)
@ConditionalOnMissingBean
public BeanNameViewResolver beanNameViewResolver() {
BeanNameViewResolver resolver = new BeanNameViewResolver();
resolver.setOrder(Ordered.LOWEST_PRECEDENCE - 10);
return resolver;
}
BeanNameViewResolver используется для разрешения имен представлений в bean-компоненты в контексте.
WebMvcRegistrations
Это интерфейс, который может регистрировать ключевые аннотации WebMvcConfigurationSupport для переопределения Spring. Компоненты по умолчанию, предоставляемые MVC
ConversionService
Интерфейс службы преобразования типов
Spring MVC 使использоватьHttpMessageConverter
интерфейс для конвертацииHTTPпроситьиответ,Готов к использованию прямо из коробки. Например,Объекты могут быть автоматически преобразованы в JSONилиXML (с использованием расширения Jackson XML).,Используйте JAXB, если он недоступен),По умолчанию,字符串使использоватьUTF-8
кодирование。
Если вам нужен собственный конвертер, вы можете использовать Spring Boot из HttpMessageConverters
добрый,Как показано ниже:
import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
@Configuration(proxyBeanMethods = false)
public class MyHttpMessageConvertersConfiguration {
@Bean
public HttpMessageConverters customConverters() {
HttpMessageConverter<?> additional = new AdditionalHttpMessageConverter();
HttpMessageConverter<?> another = new AnotherHttpMessageConverter();
return new HttpMessageConverters(additional, another);
}
}
существоватьначальство Вниз文середина存существоватьизлюбойHttpMessageConverter
都会добавить в到转换器列表середина,Конвертер по умолчанию можно переопределить таким же образом.
Spring MVC имеет стратегию генерации кодов ошибок.,использовать Вот绑定из错误середина渲染错误информация:MessageCodesResolver
。нравиться果你设置Понятноspring.mvc.message-codes-resolver-format
свойствоPREFIX_ERROR_CODE
или ВОЗPOSTFIX_ERROR_CODE
,Spring Boot Один будет создан автоматически.
По умолчанию из, Весна Boot поставлятьстатический контентиз路径дадобрый路径из/static
или/public
или/resources
или/META-INF/resources
или ВОЗServletContext
изкореньглаз录。它使использоватьSpring MVCизResourceHttpRequestHandler
иметь дело с, 也可к通过добавить в自己изWebMvcConfigurer
и переопределитьaddResourceHandlers
метод来修改。
В автономной программе извебприложение,Контейнер сервлета по умолчанию не включен,可к使использоватьserver.servlet.register-default-servlet
свойство启использовать。
Сервлет по умолчанию действует как запасной вариант, если весна решила этим не заниматься,Затем изServletContext
изкореньглаз录серединапоставлять内容。большую часть времени,Этого не произойдет (если вы не измените конфигурацию MVC по умолчанию).,потому чтоSpringвсегда можно пройтиDispatcherServlet
иметь дело спросить。
По умолчанию,Сопоставление ресурсов в/**
начальство,ноты可к使использоватьspring.mvc.static-path-pattern
свойство进行调整。Например,Перенесите все ресурсы в/resources/**
Вы можете сделать следующее:
spring.mvc.static-path-pattern=/resources/**
ты还可к使использоватьspring.web.resources.static-locations
свойство自определениестатическийресурс Расположение(Воляпо умолчаниюценитьзаменятьдляглаз录Расположение列表)。кореньservletначальство Вниз文路径"/"
также будет автоматически добавлен в качестве местоположения。
В дополнение к «стандартному» расположению статического ресурса, упомянутому ранее,,Также была обеспечена совместимость с контентом Webjars.,Если упаковано,любой/webjars/**
из Ресурс пути будет отjarдокументсередина Получать。
Если ваша программа-исприложение упакована в виде jar-файла,请勿使использовать
/src/main/webapp
глаз录,Потому что это будет проигнорировано,Хотя этот каталог является обычным стандартным,Но он используется только для военного пакета.
Spring Boot также поддерживает Spring MVC, предоставляющий расширенные функции обработки ресурсов, такие как очистка кэша, или предоставление независимых от версии URL-адресов для веб-джаров.
Использование несвязанных URL-адресов Webjarsиз Версия,добавить вwebjars-locator-core
Зависимости,Затем объявите Webjar. Возьмем jQuery в качестве примера,добавить в"/webjars/jquery/jquery.min.js"
Комбинация станет"/webjars/jquery/x.y.z/jquery.min.js"
,其серединаx.y.z
даWebjarВерсия。
Если использовать из, это JBoss,вам нужно заявить
webjars-locator-jboss-vfs
Зависимости,而不даwebjars-locator-core
,В противном случае все изWebjars будет проанализирован как 404.
Добавляя хэш-значение к URL-адресу,Повредить статический кеш ресурсов,Следующая конфигурация предотвращает кэширование всех статических ресурсов.,比нравиться<link href="/css/spring-2a2d595e6ed9a0b24f027f2b63b134d6.css"/>
。
spring.web.resources.chain.strategy.content.enabled=true
spring.web.resources.chain.strategy.content.paths=/**
Спасибо ThymelafиFreeMarkerавтоматическая конфигурация ПонятноResourceUrlEncodingFilter,Ссылки на ресурсы перезаписываются в шаблоне во время выполнения. При использовании JSP,Вам следует объявить этот фильтр вручную. Другие шаблонизаторы в настоящее время автоматически не поддерживаются.,но可к使использовать自определениешаблонmacros/helpersи使использоватьResourceUrlProvider。
«Фиксированная» стратегия позволяет добавить статическую строку версии к 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/
Внизизресурс使использоватьfixed
Стратегия(/v12/js/lib/mymodule.js
),而другойресурс依然使использовать内容Стратегия(<link href="/css/spring-2a2d595e6ed9a0b24f027f2b63b134d6.css"/>
)。
ПроверятьWebProperties.Resources
,Получите больше поддержки из опций.
Эта функция была посвященаизсообщение в блогеиSpring FrameworkизСправочная документациясередина进行Понятно详尽изописывать。
Spring Boot Поддержка статических и шаблонных страниц сторона приветствия, сначала настраивает изстатический Найдите файл index.html в папке с контентом. Если он не найден, будет выполнен поиск по шаблону индекса. Если он найден, он автоматически будет использоваться в качестве приложения на странице. приветствия。
Как и другие статические ресурсы, Spring Boot Настрою изстатический контентпроверка местоположенияfavicon.ico
,Если такой файл существует, он автоматически будет использоваться в качестве значка приложения.
Spring MVC может запросить путь и сопоставить его с тем, который определен в программе (например,,控制器начальствоиз@GetMapping
аннотация)пройти внутрьизHTTPпроситькартографирование到иметь дело спрограмма。
Spring Boot по умолчанию отключает режим сопоставления суффиксов,картина"GET /projects/spring-boot.json"
такиз Адрес не будет следовать@GetMapping("/projects/spring-boot")
соответствовать。该Функция主要использовать В不会发送正确из"Accept"головаизHTTPклиент。
Всегда правильный из не будет отправлен "Accept"головаизклиент,Может использоваться без сопоставления суффикса,Вместо этого используйте параметры запроса,比нравиться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
Начиная с весны Framework, начиная с версии 5.3, Весна MVC поддерживает несколько стратегий реализации для сопоставления путей запроса с обработчиками контроллера. Ранее он поддерживал только стратегии AntPathMatcher.,но现существовать还поставлятьPathPatternParser
。Spring Теперь Boot предоставляет свойство конфигурации для выбора новой стратегии:
spring.mvc.pathmatch.matching-strategy=path-pattern-parser
Более подробно об этой реализации из,ссылка该сообщение в блоге。
PathPatternParser
да一个优化извыполнить,но限制ПонятноНекоторые варианты шаблонов путейиз使использовать,并且与后缀модельсоответствовать(spring.mvc.pathmatch.use-suffix-pattern
,spring.mvc.pathmatch.use-registered-suffix-pattern
)или ВоляDispatcherServlet
сопоставлено сservletпрефикс(spring.mvc.servlet.path
)。
Spring MVC 使использоватьWebBindingInitializer
для конкретногоизпросить初始化WebDataBinder
。нравиться果你创建自己изConfigurableWebBindingInitializer
Bean,Spring Boot Spring будет настроен автоматически MVC Используйте это.
Spring MVC поддерживает несколько технологий шаблонов, включая Thymeleaf, FreeMarker и JSP.
Избегайте использования JSP, существуют некоторые известные проблемы при его использовании со встроенными контейнерами сервлетов.
Используйте одну из конфигураций по умолчанию,Шаблон автоматически изsrc/main/resources/templates
Получать。
По умолчанию весна Boot поставлять一个/error
картографирование,Обрабатывайте все ошибки разумным образом.,Она регистрируется как «глобальная» страница ошибок в контейнере сервлетов. Он сгенерирует ответ JSON, включая информацию об ошибке, статусе HTTP и исключении на клиентском компьютере. Для браузерных клиентов,создаст представление ошибок «whitelabel»,Отображение тех же данных в формате HTML (настраиваемые слова,добавить в一个Vuew
решитьerror
)。
Может пройти несколькоserver.error
свойство来自определениепо умолчанию Обработка ошибок Поведение。更多КонфигурацияПосмотреть приложение。
полностью заменить По умолчанию из Поведение,可квыполнитьErrorController
и зарегистрирован какBean
или ВОЗдобавить вErrorAttributes
типизbeanЗаменить контент。
你也可киспользовать@ControllerAdvice
настроитьJSONтекстилианомальныйтип,Как показано ниже:
import javax.servlet.RequestDispatcher;
import javax.servlet.http.HttpServletRequest;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;
@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
да Зависит отSomeController
расположениеизпакет бросковизаномальный,使использоватьMyErrorBody
POJOизJSONзаменятьErrorAttributes
извыражать。
в некоторых случаях,Ошибки обработки на уровне контроллера не регистрируются метриками.,Установив обработку исключения в качестве атрибута запроса,Программа приложения гарантирует, что такие исключения регистрируются вместе с метриками запросов.
import javax.servlet.http.HttpServletRequest;
import org.springframework.boot.web.servlet.error.ErrorAttributes;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
@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/
| + <source code>
+- resources/
+- public/
+- error/
| +- 404.html
+- <other public assets>
Используйте шаблон FreeMark для сопоставления всех ошибок 5xx со следующей структурой:
src/
+- main/
+- java/
| + <source code>
+- resources/
+- templates/
+- error/
| +- 5xx.ftlh
+- <other templates>
Для более сложного картографирования,可кдобавить ввыполнитьErrorViewResolver
интерфейсизbean,следующее:
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.springframework.boot.autoconfigure.web.servlet.error.ErrorViewResolver;
import org.springframework.http.HttpStatus;
import org.springframework.web.servlet.ModelAndView;
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;
}
}
Вы также можете использовать обычный из @ExceptionHandler
и @ControllerAdvice
характеристика,ЗатемErrorController
会иметь дело с
За то, что не используете Spring MVCизприложениепрограмма,可к使использоватьErrorPageRegistrar
интерфейс直接зарегистрироватьсяErrorPages
。Эта абстракция напрямую связана с лежащей в ее основеиз Встроенныйservletконтейнер一起使использовать,Прямо сейчас使没有Spring MVC DispatcherServlet Это также действительно.
import org.springframework.boot.web.server.ErrorPage;
import org.springframework.boot.web.server.ErrorPageRegistrar;
import org.springframework.boot.web.server.ErrorPageRegistry;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpStatus;
@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"));
}
}
нравиться果зарегистрироваться Понятно一个ErrorPage
,其路径最终Зависит отFilter
иметь дело с(Это в каком-то неSpring Web框架середина很常见,Такие как Джерси и Калитка),ТакFilter
Должно быть явно зарегистрировано какERROR
Планировщик,Как показано в следующем примере:
import java.util.EnumSet;
import javax.servlet.DispatcherType;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@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
Планировщиктип。
Spring Boot использует свой фильтр страниц ошибок для пересылки запросов со статусом ошибки на соответствующую страницу ошибок. Это необходимо,Потому что спецификация сервлета не предоставляет API для регистрации страниц ошибок. Развертывайте файлы и контейнеры WAR, а также приложения-программы с использованием технологий.,Могут потребоваться некоторые дополнительные настройки.
Только если ответ еще не отправлен,страница ошибкифильтр才能Воляпросить转发到正确изстраница ошибки。По умолчанию,WebSphere Application Server 8.0и выше Версияпри успешном завершенииservletиз服务метод后提交ответ。ты应该通过Воляcom.ibm.ws.webcontainer.invokeFlushAfterService
установлен наfalse
来禁использовать此Поведение。
Если вы используете Spring Безопасность и вы хотите получить доступ к участнику на страницах ошибок, вам необходимо настроить Spring Фильтр безопасности,быть вызван при отправке ошибки. с этой целью,请Воляspring.security.filter.dispatcher-types
свойствоустановлен наasync, error, forward, request
。
Междоменное совместное использование ресурсов(CORS)да Зависит отбольшинство браузероввыполнитьизСпецификация W3C,Позволяет гибко указать, какие междоменные запросы разрешены.,Вместо того, чтобы использовать какой-то метод безопасности, менее сексуальный и слабый.,Например, IFRAME или JSONP.
Начиная с версии 4.2, Spring MVC поддерживает CORS. Весной Bootприложениепрограммасередина使использовать带有@CrossOrigin
аннотацияиз控制器метод,CORS不нуждатьсялюбой特定из Конфигурация。可к通过使использовать自определениеизaddCorsMappings(CorsRegistry)
методзарегистрироватьсяWebMvcConfigurer
bean-компонент для определения глобальной конфигурации CORS, как показано в следующем примере:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration(proxyBeanMethods = false)
public class MyCorsConfiguration {
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**");
}
};
}
}
Если вы предпочитаете конечные точки REST из модели программирования JAX-RS,Вы можете использовать одну из доступных реализаций,而不даSpring MVC。JerseyиApache CXF开箱Прямо сейчасиспользовать。CXFВы обязаныприложениепрограмманачальство Вниз文середина Воля其Servlet
илиFilter
Зарегистрируйтесь как@Bean
。JerseyЕсть некоторые родныеизSpringподдерживать,Итак, мы все ещеSpring Boot обеспечивает поддержку автоматической настройки, а также средство запуска.
Чтобы начать работу с Джерси,请Воляspring-boot-starter-jersey
как Зависимости,Затемтынуждаться一个типResourceConfig
из@Bean
,Прорегистрируйте в нем все конечные точки,Как показано в следующем примере:
import org.glassfish.jersey.server.ResourceConfig;
import org.springframework.stereotype.Component;
@Component
public class MyJerseyConfig extends ResourceConfig {
public MyJerseyConfig() {
register(MyEndpoint.class);
}
}
Поддержка сканирования исполняемых файлов в Джерси весьма ограничена. Например,При запуске исполняемого файла War,это не можетсканированиеПолностью исполняемый файл изjarилиWEB-INF/classes
середина找到из包серединаизконечная точка。для Понятно避免这种限制,不应使использоватьpackages
метод,并且应使использоватьregister
метод单独зарегистрироватьсяконечная точка,Как показано в предыдущем примере.
Для более продвинутой настройки,Вы также можете зарегистрировать столько, сколько захотитеизвыполнитьResourceConfigCustomizer
изbean。
Все регистрацииизконечная точка都应该да带有HTTPресурсаннотацияиз@Components
(@GET
ждать),Как показано в следующем примере:
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import org.springframework.stereotype.Component;
@Component
@Path("/hello")
public class MyEndpoint {
@GET
public String message() {
return "Hello";
}
}
Зависит от ВEndpoint
даSpring @Component
,Его жизненный цикл управляется Spring,ты可к使использовать@Autowired
注释注入Зависимости,并使использовать@Value
注释注入外部Конфигурация。По умолчанию,Jersey servlet被зарегистрироваться并картографирование到/*
。ты可к通过Воля@ApplicationPath
добавить в到ResourceConfigResourceConfig
更改картографирование。
По умолчанию,Jerseyво имяjerseyServletRegistrationBeanтипиз@Bean
серединаустановлен наservlet,названныйjerseyServletRegistration
。По умолчанию,сервлет лениво инициализируется,Но вы можете установитьspring.jersey.servlet.load-on-startup
来自определение该Поведение。Вы можете создать свой собственныйиз То же имяbean来禁использоватьилиотменить этоbean。Вы также можете установитьspring.jersey.type=filter
(существовать这种情况Вниз,заменятьиликрышкаisjerseyFilterRegistrationиз@Bean
)来使использоватьфильтр而不даservlet。фильтр有一个@Order
,你可киспользоватьspring.jersey.filter.order
Выполните настройки。当使использоватьJerseyкакфильтр时,Должен существовать сервлет для обработки любых запросов, которые не перехватываются Джерси. Если ваша программа-исприложение не содержит такого сервлета,ты可能希望通过Воляserver.servlet.register-default-servlet
установлен наtrue
来启использоватьпо умолчаниюservlet。servletифильтрзарегистрироваться都可к通过使использоватьspring.jersey.init.*
指定свойствокартографирование来поставлятьinitпараметр。
Для приложений сервлетов Spring Boot包括对ВстроенныйTomcat、JettyиUndertowсерверизподдерживать。大多数развивать人员使использовать适当из“Starter”来Получать完全Конфигурацияиз Пример。По умолчанию,Встроенныйсерверсуществоватьport8080
начальство监听HTTPпросить。
При использовании встроенного контейнера сервлетов,Это можно сделать с помощью компонента Springbean или сканированиясервлета.,отservletспецификациясерединазарегистрироватьсяservlet、фильтри Все слушатели(нравитьсяHttpSessionListener
)。
Всё как весна beanизServlet
、Filter
илиservlet*Listener
Пример都зарегистрироватьсяво встроенном контейнере。нравиться果ты想существовать Конфигурация期间引использоватьapplication.properties
серединаизценить,Это может быть особенно удобно.
По умолчанию,Если контекст содержит только один сервлет,则Воля其картографирование到/
。в несколькихservlet beanиз情况Вниз,bean名称использовать作路径префикс。фильтркартографирование到/*
。
Если сопоставление, основанное на соглашении, недостаточно гибко,ты可к使использоватьServletRegistrationBean
、FilterRegistrationBean
иServletListenerRegistrationBean
добрый进行完全控制。
Фильтрующие зерна, которые не заказываются, обычно относятся к категории «Безопасность». Если вам нужно уточнить заказ,ты应该использовать@Order
аннотацияFilterили使其выполнитьOrdered
。ты无法通过использовать@Order
аннотация其beanметод来КонфигурацияFilter
иззаказ。нравиться果ты无法ВоляFilter
добрый更改длядобавить в@Order
иливыполнитьOrdered
,тогда это должно бытьFilter
определениеFilterRegistrationBean,并使использоватьsetOrder(int)
метод设置зарегистрироватьсяbeanиззаказ。避免КонфигурациясуществоватьOrdered.HIGHEST_PRECEDENCE
读取просить主体изфильтр,Потому что это может быть похоже на программу-приложение по настройке кодировки символов. Если фильтр сервлета оборачивает запрос,则应Конфигурация小Вилиждать ВOrderedFilter.REQUEST_WRAPPER_FILTER_MAX_ORDER
иззаказ。
要Проверятьприложениепрограммасередина每个Filter
иззаказ,пожалуйста заweb
группа журналов启использовать调试уровень日志记录(logging.level.web=debug
)。Затем,Сведения о зарегистрированном фильтре будут регистрироваться при запуске.,Включает его порядок и шаблон URL.
зарегистрироватьсяFilter
beanБудьте осторожны, когда,потому что它们существоватьприложениепрограмма生命周期из早期就被初始化Понятно。нравиться果тынуждатьсязарегистрироваться与другойbeanвзаимодействиеизFilter
,请考虑使использоватьDelegatingFilterProxyRegistrationBean
。
Встроенный контейнер сервлетов не выполняет сервлет напрямую. 3.0+ javax.servlet.ServletContainerInitializer
интерфейсилиSpringизorg.springframework.web.WebApplicationInitializer
интерфейс。这да一个有意издизайнерские решения,направленный на сокращениеwarсередина运行из Сторонние библиотеки могут сломатьсяSpring Загрузочное приложение программы из рисков.
Если вам нужно использовать Spring Загрузочное приложение, выполнение сервлета. Инициализация. контекста,ты应该зарегистрироваться一个выполнитьorg.springframework.boot.web.servlet.ServletContextInitializer
интерфейсизbean。одинокийизonStartup
методпоставлять对ServletContext
издоступ,если необходимо,可к轻松использовать作现有WebApplicationInitializer
изадаптер。
во встроенном контейнере,可к使использовать@ServletComponentScan
включать@WebServlet
, @WebFilter
, и @WebListener
аннотацияиз Автоматическая регистрация。
в отдельном контейнере,
@ServletComponentScan
нет эффекта,Вместо этого используйте встроенный механизм обнаружения контейнера.
Spring Boot 底层使использовать不同типизApplicationContext
来поддерживать Встроенныйserveltконтейнер。ServletWebServerApplicationContext
да一种特殊изWebApplicationContext
,Он ищет одинServletWebServerFactory
Компонент загружает сам себя. Обычно автоматическая конфигурацияTomcatServletWebServerFactory
、JettyServletWebServerFactory
илиUndertowServletWebServerFactory
。
Обычно нет необходимости знать об этих классах реализации. Большинство приложений-программ являются автоматическими. конфигурацияиз,而且Волякорень据你изтребуют создания соответствующихиз
ApplicationContext
иServletWebServerFactory
。
ServletContext устанавливается во время процесса запуска сервера. потому что,ApplicationContext
серединаизbean无法使использоватьServletContext
Надежная инициализация。решить эту проблемуиз一种методда ВоляApplicationContext
какbeanиз Зависимости注入,并仅существоватьнуждаться时доступServletContext
。另一种методдасуществоватьсервер启动后使использовать回调。这可к使использоватьApplicationListener
Заканчивать,оно слушаетApplicationStartedEvent
,Как показано ниже:
import javax.servlet.ServletContext;
import org.springframework.boot.context.event.ApplicationStartedEvent;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationListener;
import org.springframework.web.context.WebApplicationContext;
public class MyDemoBean implements ApplicationListener<ApplicationStartedEvent> {
private ServletContext servletContext;
@Override
public void onApplicationEvent(ApplicationStartedEvent event) {
ApplicationContext applicationContext = event.getApplicationContext();
this.servletContext = ((WebApplicationContext) applicationContext).getServletContext();
}
}
Можно использовать пружину Environment
свойство Конфигурация常использоватьизservletконтейнер设置。в целом,ты Волясуществоватьapplication.properties
илиapplication.yaml
документсерединаопределениесвойство。
Общие настройки службы включают в себя:
server.servlet.session.persistent
),сессия超时(server.servlet.session.timeout
),данные сеансаиз Расположение(server.servlet.session.store-dir
),сессияcookieКонфигурация(server.servlet.session.cookie.*
)。server.error.path
)ждатьждать。Spring Boot изо всех сил старается раскрыть общие настройки, но это не всегда возможно. Для этих ситуаций,专использовать名称空间поставлять特定серверизсделанный на заказ(Видетьserver.tomcat
иserver.undertow
)。 Например, журналы доступа можно настроить с использованием определенных функций встроенного контейнера сервлетов.
Полный список,Видеть
ServerProperties
добрый。
Атрибут cookie SameSite может использоваться веб-браузерами для управления тем, отправляются ли файлы cookie в межсайтовых запросах и каким образом. Это свойство особенно важно для современных веб-браузеров, когда оно отсутствует, поскольку они начинают менять значение по умолчанию.
Если вы хотите изменить атрибут cookie сеанса изSameSite,你可к使использоватьserver.servlet.session.cookie.same-site
свойство。这个свойство被автоматическая Поддерживается вариантами серверов Tomcat, Jetty и Undertow.
Например,нравиться果ты希望сессияcookieиметьNone
изSameSite
свойство,ты可к Воляк Вниз内容добавить в到тыизapplication.properties
илиapplication.yaml
документсередина:
server.servlet.session.cookie.same-site=none
нравиться果ты想更改добавить в到HttpServletResponse
издругойcookieначальствоизSameSite
свойство,ты可к使использоватьCookieSameSiteSupplier
。CookieSameSiteSupplier
передатьCookie
,и может вернутьсяSameSiteценитьилиnull
。
Существует множество удобных заводских методов и методов фильтрации, которые позволяют быстро подобрать конкретные параметры. печенье. Например, добавьте следующее bean автоматически сопоставит имя с регулярным выражением myapp.* Матч из всех cookie приложение Lax из SameSite。
import org.springframework.boot.web.servlet.server.CookieSameSiteSupplier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration(proxyBeanMethods = false)
public class MySameSiteConfiguration {
@Bean
public CookieSameSiteSupplier applicationCookieSameSiteSupplier() {
return CookieSameSiteSupplier.ofLax().whenHasNameMatching("myapp.*");
}
}
Если вам нужно программно настроить встроенный контейнер сервлетов,ты可кзарегистрироватьсявыполнитьWebServerFactoryCustomizer
интерфейсизSpring Bean。WebServerFactoryCustomizer
поставлять对ConfigurableServletWebServerFactory
издоступ,Сюда входит множество способов настройки параметров. В следующем примере показана программная настройка порта:
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.stereotype.Component;
@Component
public class MyWebServerFactoryCustomizer implements WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> {
@Override
public void customize(ConfigurableServletWebServerFactory server) {
server.setPort(9000);
}
}
TomcatServletWebServerFactory
、JettyServletWebSServerFactory
иUndertowServletWebSrverFactory
даConfigurableServletWebServerFactory
из专использовать变体,Они соответственноTomcat、JettyиUndertowпоставлять Понятно额外из自определениеsetterметод。к Вниз示例显示Понятнонравиться何自определениеTomcatServletWebServerFactory
,Чтобы предоставить доступ к конкретным параметрам конфигурации Tomcat:
import java.time.Duration;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.stereotype.Component;
@Component
public class MyTomcatWebServerFactoryCustomizer implements WebServerFactoryCustomizer<TomcatServletWebServerFactory> {
@Override
public void customize(TomcatServletWebServerFactory server) {
server.addConnectorCustomizers((connector) -> connector.setAsyncTimeout(Duration.ofSeconds(20).toMillis()));
}
}
对ВнуждатьсятыотServletWebServerFactory
Расширятьизвыше级использовать例,Вы можете выставить такой тип bean-компонента самостоятельно.
Сеттеры предусмотрены для многих вариантов конфигурации. Если вам нужно сделать что-то более дифференцированное,Также предусмотрено несколько защищенных методов «крючков». Для получения дополнительной информации,ВидетьДокументация исходного кода。
Существуют некоторые ограничения на поддержку JSP при запуске программ с использованием встроенного контейнера сервлетов (и упакованного в виде исполняемого архива) из приложения Spring Boot.
java -jar
При запуске,Исполняемая война сработает,Также может быть развернут в любой стандартный контейнер. JSP не поддерживается при использовании исполняемых файлов jar.error.jsp
页лапша不会крышкаОбработка ошибокиз Вид по умолчанию。应使использоватьПользовательская страница ошибоклапша。Spring Загрузочные пропуска на весну Webfluxпоставлятьавтоматическая конфигурация,简化Понятно РеакцияWebприложениепрограммаизразвивать。
Spring WebFlux — это весна Framework В версии 5.0 представлен новый реактивный веб-фреймворк. с весной MVC отличается, он не требует сервлетов. API,Полностью асинхронен и неблокируется.,и пройтиПроект реакторавыполнитьReactive Streamsспецификация。
Spring WebFlux Существует две формы: функциональные изи, основанные на аннотациях из. Судя по аннотации, форма очень близка к Spring. Модель MVC, как показано ниже:
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@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 Mono<User> getUser(@PathVariable Long userId) {
return this.userRepository.findById(userId);
}
@GetMapping("/{userId}/customers")
public Flux<Customer> getUserCustomers(@PathVariable Long userId) {
return this.userRepository.findById(userId).flatMapMany(this.customerRepository::findByUser);
}
@DeleteMapping("/{userId}")
public Mono<Void> deleteUser(@PathVariable Long userId) {
return this.userRepository.deleteById(userId);
}
}
«WebFlux.fn» — функциональный вариант,Отделите настройку маршрутизации от фактической обработки запросов.,Как показано в следующем примере:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.web.reactive.function.server.RequestPredicate;
import org.springframework.web.reactive.function.server.RouterFunction;
import org.springframework.web.reactive.function.server.ServerResponse;
import static org.springframework.web.reactive.function.server.RequestPredicates.accept;
import static org.springframework.web.reactive.function.server.RouterFunctions.route;
@Configuration(proxyBeanMethods = false)
public class MyRoutingConfiguration {
private static final RequestPredicate ACCEPT_JSON = accept(MediaType.APPLICATION_JSON);
@Bean
public RouterFunction<ServerResponse> monoRouterFunction(MyUserHandler userHandler) {
return route()
.GET("/{user}", ACCEPT_JSON, userHandler::getUser)
.GET("/{user}/customers", ACCEPT_JSON, userHandler::getUserCustomers)
.DELETE("/{user}", ACCEPT_JSON, userHandler::deleteUser)
.build();
}
}
import reactor.core.publisher.Mono;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.server.ServerRequest;
import org.springframework.web.reactive.function.server.ServerResponse;
@Component
public class MyUserHandler {
public Mono<ServerResponse> getUser(ServerRequest request) {
...
}
public Mono<ServerResponse> getUserCustomers(ServerRequest request) {
...
}
public Mono<ServerResponse> deleteUser(ServerRequest request) {
...
}
}
WebFlux — часть фреймворка «Это весна».,Подробности можно найти на егоСправочная документациясередина找到。
ты可копределение任意数量изRouterFunction
bean,Определен модульным маршрутизатором из. Если вам нужно приоритетное приложение,Порядок бобов может быть определен.
Воляspring-boot-starter-webflux
модульдобавить в到приложениесерединак开始webflux。
существоватьприложениепрограммасерединадобавить вspring-boot-starter-web
иspring-boot-starter-webflux
модуль会导致Spring Boot автоматически настраивает Spring MVC,而不даWebFlux。выбирать此Поведениедапотому что许多Springразвивать人员Воляspring-boot-starter-webflux
добавить в到他们изSpring MVCприложениепрограммасерединак使использовать РеакцияWebClient
。ты仍然可к通过Воля所选приложениепрограмматипустановлен наSpringApplication.setWebApplicationType(WebApplicationType.REACTIVE)
обеспечить соблюдение вашегоизвыбирать。
Spring Ботинок на весну WebFluxпоставлять Понятноавтоматическая конфигурация,适использовать В大多数приложениепрограмма。
Автоматическая модификация добавляет следующие функции поверх Spring по умолчанию:
HttpMessageReader
иHttpMessageWriter
Пример Конфигурациякодек(далее в этом документеописывать)。Если вы хотите сохранить весну Boot WebFluxФункция,并想добавить в额外изКонфигурация WebFlux,ты可кдобавить в自己изWebFluxConfigurer
типиз@Configuration
добрый,ноНе добавлять@EnableWebFlux
。
Если вы хотите полный контроль над Spring WebFlux,可кдобавить в自己из@Configuration
,并использовать@EnableWebFlux
отметка。
Spring WebFlux 使использоватьHttpMessageReader
иHttpMessageWriter
интерфейс для конвертацииHTTPпроситьиответ。 они используют CodecConfigurer Разумные значения по умолчанию настроены так, что этого можно достичь, просмотрев доступные библиотеки в вашем пути к классам.
Spring Bootпоставлять专использоватьизкодек Конфигурациясвойствоspring.codec.*
,它还通过使использоватьCodecCustomizer
Пример来进一步自определение。Например,spring.jackson.*
Конфигурация密钥приложение ВJacksonкодек。
Если вам нужно добавить собственный кодек,ты可к创建自определениеCodecCustomizer
компоненты,Как показано в следующем примере:
import org.springframework.boot.web.codec.CodecCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.codec.ServerSentEventHttpMessageReader;
@Configuration(proxyBeanMethods = false)
public class MyCodecsConfiguration {
@Bean
public CodecCustomizer myCodecCustomizer() {
return (configurer) -> {
configurer.registerDefaults(false);
configurer.customCodecs().register(new ServerSentEventHttpMessageReader());
// ...
};
}
}
ты还可к利использоватьЗагрузка пользовательского сериализатора JSON и десериализатора。
По умолчанию весна Bootотдобрый路径серединаназванный/static
(или/public
или/resources
или/META-INF/resources
)изглаз录поставлятьстатический содержание. Он использует Spring WebFluxсерединаизResourceWebHandler
,к便ты可к通过добавить в自己изWebFluxConfigurer
и переопределитьaddResourceHandlers
метод来修改该Поведение。
По умолчанию,Сопоставление ресурсов в/**
начальство,Но вы можете установитьspring.webflux.static-path-pattern
свойство进行调整。Например,Перенесите все ресурсы в/resources/**
可квыполнитьк Вниз操作:
spring.webflux.static-path-pattern=/resources/**
ты还可к使использоватьspring.web.resources.static-locations
自определениестатическийресурс Расположение。так做会Воляпо умолчаниюценитьзаменятьдля一个глаз录Расположение列表。нравиться果тытак做,Обнаружение лиц на странице приветствия по умолчанию переключится на ваше пользовательское местоположение. поэтому,нравиться果При запускетыизлюбой Расположение都有一个index.html
,Это приложение программы с домашней страницы.
Помимо «стандартных» местоположений статических ресурсов, перечисленных выше,,Содержимое веб-джаровЕсть еще частный случай。любойсуществовать/webjars/**
иметь路径изресурс,Если упакован в формате Webjars,Он предоставляется из файла jar.
Spring Программа приложения WebFlux не полагается строго на сервлеты API,Поэтому их нельзя развернуть как военные файлы.,并且不使использовать
src/main/webapp
глаз录。
Spring BootПоддержка статических и шаблонных страниц приветствия лапши. Все начинается с изстатической конфигурации контент Расположениесередина查找index.html
документ。если не найден,он будет искатьindex
шаблон。если найденлюбой一个,Он автоматически используется в качестве приложения программы на странице приветствия.
Кроме ОТДЫХА Помимо веб-сервисов, Можно использовать пружину WebFlux предоставляет динамический HTML-контент. Весна WebFlux поддерживает различные технологии шаблонов, включая Thymeleaf, FreeMarker и Mustache.
Spring Boot включает поддержку автоматической настройки для следующих шаблонов:
Когда вы используете одну из этих конфигураций шаблонизатора по умолчанию,тыизшаблон会自动отsrc/main/resources/templates
выбирать。
Spring Bootпоставлять Понятно一个WebExceptionHandler
,Обрабатывайте все ошибки разумным образом.。它существоватьиметь дело сзаказсерединаиз Расположение紧接существоватьWebFluxпоставлятьизиметь дело спрограмма之前,Эти обработчики считаются последними. Для машинного клиента,Он выдаст ответ в формате JSON.,Он содержит сообщения об ошибках, статусе HTTP и исключениях, а также подробную информацию. Для браузерных клиентов,Есть программа "Белые страницы" Обработка ошибок.,кHTMLФормат выглядит таким жеизданные。ты还可кпоставлять自己изHTMLшаблон来显示错误(ВидетьСледующий раздел)。
Первый шаг в настройке этой функциональности обычно включает использование существующего механизма.,Но замена или усиление неправильного контента. с этой целью,ты可кдобавить вErrorAttributes
типизbean。
Чтобы изменить поведение Обработки ошибок,ты可квыполнитьErrorWebExceptionHandler
并зарегистрироваться该типизbeanопределение。Зависит от ВErrorWebExceptionHandler
Очень низкий уровень,Spring Boot还поставлять Понятно一个方便изAbstractErrorWebExceptionHandler
,Позволяет обрабатывать ошибки функциональным способом WebFlux.,Как показано в следующем примере:
import reactor.core.publisher.Mono;
import org.springframework.boot.autoconfigure.web.WebProperties.Resources;
import org.springframework.boot.autoconfigure.web.reactive.error.AbstractErrorWebExceptionHandler;
import org.springframework.boot.web.reactive.error.ErrorAttributes;
import org.springframework.context.ApplicationContext;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.server.RouterFunction;
import org.springframework.web.reactive.function.server.RouterFunctions;
import org.springframework.web.reactive.function.server.ServerRequest;
import org.springframework.web.reactive.function.server.ServerResponse;
import org.springframework.web.reactive.function.server.ServerResponse.BodyBuilder;
@Component
public class MyErrorWebExceptionHandler extends AbstractErrorWebExceptionHandler {
public MyErrorWebExceptionHandler(ErrorAttributes errorAttributes, Resources resources,
ApplicationContext applicationContext) {
super(errorAttributes, resources, applicationContext);
}
@Override
protected RouterFunction<ServerResponse> getRoutingFunction(ErrorAttributes errorAttributes) {
return RouterFunctions.route(this::acceptsXml, this::handleErrorAsXml);
}
private boolean acceptsXml(ServerRequest request) {
return request.headers().accept().contains(MediaType.APPLICATION_XML);
}
public Mono<ServerResponse> handleErrorAsXml(ServerRequest request) {
BodyBuilder builder = ServerResponse.status(HttpStatus.INTERNAL_SERVER_ERROR);
// ... additional builder calls
return builder.build();
}
}
Spring Boot включает поддержку следующих встроенных реактивных веб-серверов: Reactor. Netty、Tomcat、JettyиUndertow。大多数развивать人员使использовать适当из“Starter”来Получать完整Конфигурацияиз Пример。По умолчанию,Встроенный сервер прослушивает HTTP-запросы на порту 8080.
При автоматической настройке Reactor Сервер NettyилиJetty, Spring Boot создаст конкретный bean-компонент,向сервер ПримерпоставлятьHTTPресурс:ReactorResourceFactory
илиJettyResourceFactory
。
По умолчанию эти ресурсы также будут использоваться с Reactor. NettyиJettyклиент共享,для лучшей производительности,Данный:
WebClient.Builder
бобовая конструкцияразвивать人员可к通过поставлять自определениеReactorResourceFactory
илиJettyResourceFactory
Компонент для переопределения конфигурации ресурсов JettyиReactorNettyиз, приложение на клиенте и сервере.
ты可ксуществоватьЧасть времени выполнения веб-клиентаПонятно解有关клиентресурс Конфигурацияиз Дополнительная информация。
Все четыре встроенных веб-сервера (Jetty, Reactor Netty, Tomcat и Undertow), а также реактивные и сервлетные программы, а также веб-приложения поддерживаются. завершение работы。它как关闭приложениепрограмманачальство Вниз文изчасть этого происходит,并существовать停止SmartLifecycle
из Исполнение на самой ранней стадии。此停止иметь дело с使использовать超时,Этот тайм-аут обеспечивает льготный период,в этот период,Существующим запросам будет разрешено завершиться,но不允许新изпросить。不允许新проситьиз确切方式因正существовать使использоватьиз网络сервер而异。Jetty、Reactor NettyиTomcat перестанет принимать запросы на сетевом уровне. Undertow примет запрос, но немедленно ответит ответом «Служба недоступна» (503).
Tomcatиз Плавное завершение работынуждатьсяTomcat 9.0.33иливыше Версия。
Чтобы включить Плавное завершение работы,请Конфигурацияserver.shutdown
свойство,Как показано в следующем примере:
server.shutdown=graceful
Чтобы настроить период ожидания,请Конфигурацияspring.lifecycle.timeout-per-shutdown-phase
свойство,Как показано в следующем примере:
spring.lifecycle.timeout-per-shutdown-phase=20s
нравиться果IDEНе верно отправленоиз
SIGTERM
Сигнал,Тогда использование корректного завершения работы в IDE может работать некорректно. Для более подробной информации,Увидимся из IDE-документа.
нравиться果Spring Securityсуществоватьдобрый路径начальство,ТакWebприложениепрограмма По умолчаниюда Безопасностьиз。Spring Загрузка зависит от Spring Securityиз内容协商Стратегия来决定да使использоватьhttpBasic
还даformLogin
。кWebприложениепрограммадобавить вметод级Безопасностьсекс,ты还可к使использовать所需из设置добавить в@EnableGlobalMethodSecurity
。Дополнительная информация可ксуществоватьSpring Securityссылкагидсередина找到。
По умолчанию изUserDetailsService
只有一个использовать户。использовать户名даuser
,Пароль случайный из,Печать на уровне WARN при запуске программы приложения,Как показано в следующем примере:
Using generated security password: 78fa095d-3f4c-48b1-ad50-e24c31d5cf35
This generated password is for development use only. Your security configuration must be updated before running your application in production.
Если вы точно настроите конфигурацию журналирования,пожалуйста, убедитесь
org.springframework.boot.autoconfigure.security
добрый别установлен на日志WARN
уровеньизинформация。в противном случае,Пароль по умолчанию не будет распечатан.
可к使использоватьspring.security.user.name
иspring.security.user.password
修改использовать户名ипароль。
По умолчанию,Основные функции, которые вы получаете в программе Webприложение:
UserDetailsService
(илиReactiveUserDetailsService
,Если это приложение WebFlux), компонент автоматически генерирует пароль для одного пользователя (о пользователе и атрибуте).,ВидетьSecurityProperties.User
)。Accept
标голова)。DefaultAuthenticationEventPublisher
。ты可к通过для其добавить вbean来поставлять不同изAuthenticationEventPublisher
。
по умолчанию Безопасность КонфигурациясуществоватьSecurityAutoConfiguration
иUserDetailsServiceAutoConfiguration
серединавыполнить。SecurityAutoConfiguration
会импортироватьиспользовать ВwebБезопасностьизSpringBootWebSecurityConfiguration
иUserDetailsServiceAutoConfiguration
использовать ВКонфигурация身份验证,Это также относится к программам, не являющимся веб-приложениями. Чтобы полностью отключить конфигурацию безопасности программы Webприложения по умолчанию или объединить несколько компонентов Spring Security,Например, клиент OAuth2 и сервер ресурсов.,请добавить вSecurityFilterChain
типизbean(так做不会禁использоватьUserDetailsService
Конфигурацияилиприводиз Безопасностьсекс)。
закрытьUserDetailsService
Конфигурация,ты可кдобавить вUserDetailsService
、AuthenticationProvider
илиAuthenticationManager
типизbean。
可к通过добавить в自определениеSecurityFilterChain
илиWebSecurityConfigurerAdapter
来крышкадоступ规则。Spring Bootпоставлять Понятно方便изметод,可использовать Вкрышкаactuatorконечная точкаистатическийресурсиздоступ规则。EndpointRequest
可использовать В创建на основеmanagement.endpoints.web.base-path
свойствоизRequestMatcher
。PathRequest
可использовать Вдля常использовать Расположениеизресурс创建RequestMatcher
。
с весной MVCприложениепрограммадобрый似,ты可к通过добавить вspring-boot-starter-security
Зависимости来保护WebFluxприложениепрограмма。по умолчанию Безопасность КонфигурациясуществоватьReactiveSecurityAutoConfiguration
иUserDetailsServiceAutoConfiguration
серединавыполнить。ReactiveSecurityAutoConfiguration
импортироватьWebFluxSecurityConfiguration
использовать ВWebБезопасность,UserDetailsServiceAutoConfiguration
Конфигурация身份验证,Это также актуально для программ, не являющихся веб-приложениями. Чтобы полностью закрыть стандартную программу изWebприложения Конфигурация безопасности,ты可кдобавить вWebFilterChainProxy
типизbean(так做不会禁использоватьUserDetailsService
Конфигурацияилиприводиз Безопасностьсекс)。
закрытьUserDetailsService
Конфигурация,ты可кдобавить вReactiveUserDetailsService
илиReactiveAuthenticationManager
типизbean。
可к通过добавить в自определениеSecurityFilterChain
илиWebSecurityConfigurerAdapter
bean-компонент для переопределения правил доступа. Весна Boot предоставляет удобные методы, которые можно использовать для переопределения конечных точек исполнителя, статических ресурсов и правил доступа.
EndpointRequest
可использовать В创建на основеmanagement.endpoints.web.base-path
свойствоизRequestMatcher。PathRequest可использовать Вдля常использовать Расположениеизресурс创建RequestMatcher。
Например, вы можете настроить конфигурацию безопасности, добавив следующее:
import org.springframework.boot.autoconfigure.security.reactive.PathRequest;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.web.server.ServerHttpSecurity;
import org.springframework.security.web.server.SecurityWebFilterChain;
import static org.springframework.security.config.Customizer.withDefaults;
@Configuration(proxyBeanMethods = false)
public class MyWebFluxSecurityConfiguration {
@Bean
public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
http.authorizeExchange((exchange) -> {
exchange.matchers(PathRequest.toStaticResources().atCommonLocations()).permitAll();
exchange.pathMatchers("/foo", "/bar").authenticated();
});
http.formLogin(withDefaults());
return http.build();
}
}
OAuth2да一个广泛使использоватьиз Структура авторизации
нравиться果тыиздобрый路径начальство有spring-security-oauth2-client
,ты可к利использовать一些автоматическая Инструмент для настройки OAuth2/Open ID Connectклиент。此Конфигурация使использоватьOAuth2ClientProperties
Внизизсвойство。такой жеизсвойство适использовать Вservletиreactiveприложениепрограмма。ты可ксуществоватьspring.security.oauth2.client
префикс Вниззарегистрироваться多个OAuth2клиентипоставлять商,Как показано в следующем примере:
spring.security.oauth2.client.registration.my-client-1.client-id=abcd
spring.security.oauth2.client.registration.my-client-1.client-secret=password
spring.security.oauth2.client.registration.my-client-1.client-name=Client for user scope
spring.security.oauth2.client.registration.my-client-1.provider=my-oauth-provider
spring.security.oauth2.client.registration.my-client-1.scope=user
spring.security.oauth2.client.registration.my-client-1.redirect-uri=https://my-redirect-uri.com
spring.security.oauth2.client.registration.my-client-1.client-authentication-method=basic
spring.security.oauth2.client.registration.my-client-1.authorization-grant-type=authorization_code
spring.security.oauth2.client.registration.my-client-2.client-id=abcd
spring.security.oauth2.client.registration.my-client-2.client-secret=password
spring.security.oauth2.client.registration.my-client-2.client-name=Client for email scope
spring.security.oauth2.client.registration.my-client-2.provider=my-oauth-provider
spring.security.oauth2.client.registration.my-client-2.scope=email
spring.security.oauth2.client.registration.my-client-2.redirect-uri=https://my-redirect-uri.com
spring.security.oauth2.client.registration.my-client-2.client-authentication-method=basic
spring.security.oauth2.client.registration.my-client-2.authorization-grant-type=authorization_code
spring.security.oauth2.client.provider.my-oauth-provider.authorization-uri=https://my-auth-server/oauth/authorize
spring.security.oauth2.client.provider.my-oauth-provider.token-uri=https://my-auth-server/oauth/token
spring.security.oauth2.client.provider.my-oauth-provider.user-info-uri=https://my-auth-server/userinfo
spring.security.oauth2.client.provider.my-oauth-provider.user-info-authentication-method=header
spring.security.oauth2.client.provider.my-oauth-provider.jwk-set-uri=https://my-auth-server/token_keys
spring.security.oauth2.client.provider.my-oauth-provider.user-name-attribute=name
对ВподдерживатьOpenID Connect discoveryизOpenID Connectпоставлять商,可к进一步简化Конфигурация。поставлять商нуждаться Конфигурацияissuer-uri
,Это то, что он заявляет в качестве идентификатора эмитента — URI. Например,нравиться果поставлятьизissuer-uri
да“https://example.com”,则Воля向“https://example.com/.well-known/openid-configuration”проблема`OpenID Provider Configuration RequestОжидается, что результат будет
OpenID Provider Configuration Response. В следующем примере показано, как использовать
issuer-uri`КонфигурацияOpenID Подключить провайдера:
spring.security.oauth2.client.provider.oidc-provider.issuer-uri=https://dev-123456.oktapreview.com/oauth2/default/
По умолчанию весна SecurityизOAuth2LoginAuthenticationFilter
仅иметь дело с与/login/oauth2/code/*
соответствоватьизURL。нравиться果ты想自определениеredirect-uri
к使использовать不同измодель,Вам необходимо предоставить конфигурацию для работы с этим пользовательским режимом. Например,Для программы-приложения сервлета,ты可кдобавить вдобрый似Вк Вниз内容изSecurityFilterChain
:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.web.SecurityFilterChain;
@Configuration(proxyBeanMethods = false)
public class MyOAuthClientConfiguration {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.authorizeRequests((requests) -> requests.anyRequest().authenticated());
http.oauth2Login((login) -> login.redirectionEndpoint().baseUri("custom-callback"));
return http.build();
}
}
Spring Bootавтоматическая конфигурацияInMemoryOAuth2AuthorizedClientService
,Spring Securityиспользовать В管理клиентзарегистрироваться。InMemoryOAuth2AuthorizedClientService
из Функция有限,Мы рекомендуем использовать его только в средах разработки. Для производственной среды,请考虑使использоватьJdbcOAuth2AuthorizedClientServiceили Создай себя из
OAuth2AuthorizedClientService`выполнить。
Для распространенных провайдеров изOAuth2иOpenID,Включая Google, Github, Facebook и Okta.,我们поставлять一组поставлять商по умолчаниюценить(分别дляgoogle
、github
、facebook
иokta
)。
Если вам не нужно настраивать этих поставщиков,ты可к Воляprovider
свойствоустановлен нануждаться推断по умолчаниюценитьизпоставлятьпрограмма。также,Если ключ регистрации клиента соответствует ключу, поддерживаемому по умолчанию поставщиком,Spring Boot также сделает это вывод.
Обе конфигурации в следующих примерах используют поставщиков Google:
spring.security.oauth2.client.registration.my-client.client-id=abcd
spring.security.oauth2.client.registration.my-client.client-secret=password
spring.security.oauth2.client.registration.my-client.provider=google
spring.security.oauth2.client.registration.google.client-id=abcd
spring.security.oauth2.client.registration.google.client-secret=password
нравиться果тыиздобрый路径начальство有spring-security-oauth2-resource-server
,Spring Boot может настроить сервер ресурсов OAuth2. Для конфигурации JWT необходимо указать JWK. Set URIилиOIDC Issuer URI, как показано в следующем примере:
spring.security.oauth2.resourceserver.jwt.jwk-set-uri=https://example.com/oauth2/default/v1/keys
spring.security.oauth2.resourceserver.jwt.issuer-uri=https://dev-123456.oktapreview.com/oauth2/default/
Если сервер авторизации не поддерживает JWK Set URI,ты可к使использоватьиспользовать В验证JWTзнакиз公钥Конфигурацияресурссервер。这可к使использовать
spring.security.oauth2.resourceserver.jwt.public-key-location
свойство Заканчивать,Значение должно указывать на файл, содержащий открытый ключ формата PEM в формате x509.
Свойства также применяются к сервлетам и реактивным программам приложений.
или ВОЗ,ты可кдляservletприложениепрограммаопределение自己изJwtDecoder
bean,или ВОЗдля РеакцияприложениепрограммаопределениеReactiveJwtDecode
。
В случае использования непрозрачных токенов вместо JWTиз вы можете настроить следующие свойства для проверки токена посредством самоанализа:
spring.security.oauth2.resourceserver.opaquetoken.introspection-uri=https://example.com/check-token
spring.security.oauth2.resourceserver.opaquetoken.client-id=my-client-id
spring.security.oauth2.resourceserver.opaquetoken.client-secret=my-client-secret
Аналогично, свойства применяются к сервлетам и реактивным программам приложений.
или ВОЗ,ты可кдляservletприложениепрограммаопределение自己изOpaqueTokenIntrospector
bean,илидля РеакцияприложениепрограммаопределениеReactiveOpaquetokenIntrosector
。
В настоящее время весна Безопасность не реализует OAuth 2.0授权сервер。Однако,此Функция可отSpring Security OAuth项глаз获得,В конечном итоге проект будет полностью реализован Spring Security. до этого,ты可к使использоватьspring-security-oauth2-autoconfigure
модуль设置OAuth 2.0授权сервер;Инструкции,Видеть其документ。
Примечание автора: 笔ВОЗ有一关ВSpring Security OAuth2 Похожие из рубрик, добро пожаловать к прочтению
нравиться果тыиздобрый路径начальство有spring-security-saml2-service-provider
,ты可к利использовать一些автоматическая конфигурацияустановитьSAML 2.0доверяющая сторона。此Конфигурация使использоватьSaml2RelyingPartyProperties
Внизизсвойство。
доверяющая стороназарегистрироваться代表身份поставлять商IDPи服务поставлять商SPмеждуиз配对Конфигурация。ты可ксуществоватьspring.security.saml2.relyingparty
префикс Вниззарегистрироваться多个доверяющая сторона,Как показано в следующем примере:
spring.security.saml2.relyingparty.registration.my-relying-party1.signing.credentials[0].private-key-location=path-to-private-key
spring.security.saml2.relyingparty.registration.my-relying-party1.signing.credentials[0].certificate-location=path-to-certificate
spring.security.saml2.relyingparty.registration.my-relying-party1.decryption.credentials[0].private-key-location=path-to-private-key
spring.security.saml2.relyingparty.registration.my-relying-party1.decryption.credentials[0].certificate-location=path-to-certificate
spring.security.saml2.relyingparty.registration.my-relying-party1.singlelogout.url=https://myapp/logout/saml2/slo
spring.security.saml2.relyingparty.registration.my-relying-party1.singlelogout.response-url=https://remoteidp2.slo.url
spring.security.saml2.relyingparty.registration.my-relying-party1.singlelogout.binding=POST
spring.security.saml2.relyingparty.registration.my-relying-party1.assertingparty.verification.credentials[0].certificate-location=path-to-verification-cert
spring.security.saml2.relyingparty.registration.my-relying-party1.assertingparty.entity-id=remote-idp-entity-id1
spring.security.saml2.relyingparty.registration.my-relying-party1.assertingparty.sso-url=https://remoteidp1.sso.url
spring.security.saml2.relyingparty.registration.my-relying-party2.signing.credentials[0].private-key-location=path-to-private-key
spring.security.saml2.relyingparty.registration.my-relying-party2.signing.credentials[0].certificate-location=path-to-certificate
spring.security.saml2.relyingparty.registration.my-relying-party2.decryption.credentials[0].private-key-location=path-to-private-key
spring.security.saml2.relyingparty.registration.my-relying-party2.decryption.credentials[0].certificate-location=path-to-certificate
spring.security.saml2.relyingparty.registration.my-relying-party2.assertingparty.verification.credentials[0].certificate-location=path-to-other-verification-cert
spring.security.saml2.relyingparty.registration.my-relying-party2.assertingparty.entity-id=remote-idp-entity-id2
spring.security.saml2.relyingparty.registration.my-relying-party2.assertingparty.sso-url=https://remoteidp2.sso.url
spring.security.saml2.relyingparty.registration.my-relying-party2.assertingparty.singlelogout.url=https://remoteidp2.slo.url
spring.security.saml2.relyingparty.registration.my-relying-party2.assertingparty.singlelogout.reponse-url=https://myapp/logout/saml2/slo
spring.security.saml2.relyingparty.registration.my-relying-party2.assertingparty.singlelogout.binding=POST
Для выхода из SAML2 По умолчанию весна SecurityизSaml2LogoutRequestFilter
иSaml2LogoutResponseFilter
仅иметь дело с与/logout/saml2/slo
соответствоватьизURL。нравиться果ты想自определениеAPинициироватьиз注销просить发送到изurl
илиAP发送注销ответизresponse-url
,Использование разных режимов,Вам необходимо предоставить конфигурацию для работы с этим пользовательским режимом. Например,Для программы-приложения сервлета,ты可кдобавить вдобрый似Вк Вниз内容изSecurityFilterChain
:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.web.SecurityFilterChain;
@Configuration(proxyBeanMethods = false)
public class MySamlRelyingPartyConfiguration {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.authorizeRequests().anyRequest().authenticated();
http.saml2Login();
http.saml2Logout((saml2) -> saml2.logoutRequest((request) -> request.logoutUrl("/SLOService.saml2"))
.logoutResponse((response) -> response.logoutUrl("/SLOService.saml2")));
return http.build();
}
}
Spring Bootдля各种данные存储поставлятьSpring Sessionавтоматическая форма. Создание сервлета Программа Webприложение может автоматическая В памяти хранятся:
Кроме того, Spring Boot Apache Geode обеспечивает автоматическую настройку Apache Geode в качестве хранилища сеансов.
servletавтоматическая конфигурация取代Понятно使использовать@Enable*HttpSession
изнуждаться。
существовать构建Реакция Программа Webприложение может автоматическая В памяти хранятся:
Реакцияавтоматическая конфигурация取代Понятно使использовать@Enable*WebSession
изнуждаться。
Spring Boot автоматически будет использовать эту реализацию хранилища. Если у вас есть несколько реализаций,则必须выбирать要использовать В存储сессияизStoreType
。Например,Использование JDBC в качестве внутреннего хранилища,Вы можете настроить программу приложения следующим образом:
spring.session.store-type=jdbc
可к Воля
store-type
установлен наnone
来禁использоватьSpring Session
Каждое хранилище имеет определенныеиз Дополнительные настройки。Например,Вы можете настроить имя таблицы хранения JDBC.,Как показано в следующем примере:
spring.session.jdbc.table-name=SESSIONS
Чтобы установить тайм-аут сеанса,ты可к使использоватьspring.session.timeout
свойство。нравиться果该свойство没有существоватьservlet Устанавливаем в программе Вебприложение, далее автоматическая конфигурация Возврат кserver.servlet.session.timeout
изценить。
可к使использовать@Enable*HttpSession
(servlet)или@Enable*WebSession
(Реакция)контролироватьSpring Настройка сессии, результатом которой станет автоматическая После резервного копирования вы можете настроить Spring, используя аннотацию свойств вместо ранее описанных свойств конфигурации. Session。