Справочное руководство Spring Boot на китайском языке (2) — Интернет
Справочное руководство Spring Boot на китайском языке (2) — Интернет

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) – Приложение

6. Web

Spring Boot Очень подходит для разработки веб-приложений, можно использовать Tomcat, Jetty, Undertow. или Netty как HTTP-сервер,на основеservletизприложение Использование программыspring-boot-starter-webмодуль,ОтзывчивыйизWebприложение Использование программыspring-boot-starter-webflux

6.1 Веб-приложение сервлетов

Если вы хотите создать веб-приложение на основе сервлетов, вы можете использовать Spring Boot Подари весне MVC или ВОЗ Автоматическая конфигурация предоставлена ​​Джерси.

6.1.1 Spring Web MVC Framework

Spring MVC Позволяет создать конкретный @Controller или @RestController Компонент для обработки входящих HTTP-запросов. Методы в контроллере сопоставляются с HTTP с помощью аннотации @RequestMapping`.

В следующем примере показан типичный предоставленный JSON. данныеиз@RestControllerпример:

Язык кода:javascript
копировать
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 MVC

Автоконфигурация добавляет следующие функции поверх конфигурации Spring по умолчанию:

  • ВключатьContentNegotiatingViewResolver Bean и BeanNameViewResolverBean
  • Поддержка обслуживания статических ресурсов, включая поддержку WebJars (описано ниже).
  • Автоматическая регистрацияConverterGenericConverterFormatter Bean
  • поддерживатьHttpMessageConverters(Следовать за介绍)
  • Автоматическая регистрацияMessageCodesResolver(Введение последует)
  • статическийindex.htmlподдерживать
  • 自动使использоватьConfigurableWebBindingInitializer bean (Введение последует)

Если вы хотите сохранить эту весну Boot MVC из Пользовательские функции,и выполнять дополнительную настройку MVC (перехватчики, форматирование, контроллеры представлений и т. д.),ты можешь добавить себяизWebMvcConfigurerтипиз@Configurationдобрый,Но не надо добавлять@EnableWebMvc

Если вы хотите предоставитьRequestMappingHandlerMappingRequestMappingHandlerAdapterилиExceptionHandlerExceptionResolverиз Пользовательский экземпляр,и сохраните настройки Spring Boot MVC,Вы можете объявитьWebMvcRegistrationsтипизbean,И используйте его для предоставления пользовательских экземпляров этих компонентов.

Если вы хотите полный контроль над Spring MVC,Вы можете добавить себяиз@Configurationиспользовать@EnableWebMvcаннотация,илиили добавьте себяиз@Configuration-annotated DelegatingWebMvcConfiguration,нравиться@EnableWebMvcизJavadocсередина所述。

Spring MVC使использоватьизConversionService与использовать Вотapplication.propertiesилиapplication.yamlдокументсередина转换ценитьиз Услуги разные。это означаетPeriodDurationиDataSize转换器不可использовать,@DurationUnitи@DataSizeUnitКомментарии будут игнорироваться。

Если вы хотите настроить Spring MVC使использоватьизConversionService,Может быть предоставлен сaddFormattersметодизWebMvcConfigurer bean。通过此метод,Вы можете зарегистрировать любой понравившийся вам конвертер,Это также можно делегироватьApplicationConversionServiceначальство可использоватьизстатическийметод。

Примечание автора:

Spring MVCавтоматическая конфигурация Зависит отspring-boot-autoconfigure依赖серединаизWebMvcAutoConfigurationдобрый加载

ContentNegotiatingViewResolverиз Конфигурация

Язык кода:javascript
копировать
@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из Конфигурация

Язык кода:javascript
копировать
@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 Интерфейс службы преобразования типов

HttpMessageConverters

Spring MVC 使использоватьHttpMessageConverterинтерфейс для конвертацииHTTPпроситьиответ,Готов к использованию прямо из коробки. Например,Объекты могут быть автоматически преобразованы в JSONилиXML (с использованием расширения Jackson XML).,Используйте JAXB, если он недоступен),По умолчанию,字符串使использоватьUTF-8кодирование。

Если вам нужен собственный конвертер, вы можете использовать Spring Boot из HttpMessageConvertersдобрый,Как показано ниже:

Язык кода:javascript
копировать
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都会добавить в到转换器列表середина,Конвертер по умолчанию можно переопределить таким же образом.

MessageCodesResolver

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/**Вы можете сделать следующее:

Язык кода:javascript
копировать
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"/>

Язык кода:javascript
копировать
spring.web.resources.chain.strategy.content.enabled=true
spring.web.resources.chain.strategy.content.paths=/**

Спасибо ThymelafиFreeMarkerавтоматическая конфигурация ПонятноResourceUrlEncodingFilter,Ссылки на ресурсы перезаписываются в шаблоне во время выполнения. При использовании JSP,Вам следует объявить этот фильтр вручную. Другие шаблонизаторы в настоящее время автоматически не поддерживаются.,но可к使использовать自определениешаблонmacros/helpersи使использоватьResourceUrlProvider

«Фиксированная» стратегия позволяет добавить статическую строку версии к URL-адресу загрузки без изменения имени файла.,Как показано ниже:

Язык кода:javascript
копировать
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")

Язык кода:javascript
копировать
spring.mvc.contentnegotiation.favor-parameter=true

Другие используют другие имена параметров:

Язык кода:javascript
копировать
spring.mvc.contentnegotiation.favor-parameter=true
spring.mvc.contentnegotiation.parameter-name=myparam

Большинство типов мультимедиа поддерживаются «из коробки», но также можно определить новые типы мультимедиа.

Язык кода:javascript
копировать
spring.mvc.contentnegotiation.media-types.markdown=text/markdown

Шаблон соответствия суффиксов устарел.,и будет удалено в будущем. Версия,Если вы все еще хотите использовать шаблон сопоставления суффиксов,Требуется следующая конфигурация:

Язык кода:javascript
копировать
spring.mvc.contentnegotiation.favor-path-extension=true
spring.mvc.pathmatch.use-suffix-pattern=true

или ВОЗ,По сравнению с включением режима всех суффиксов,Поддерживается регистрация только в режиме обновления суффикса. Безопасность:

Язык кода:javascript
копировать
spring.mvc.contentnegotiation.favor-path-extension=true
spring.mvc.pathmatch.use-registered-suffix-pattern=true

Начиная с весны Framework, начиная с версии 5.3, Весна MVC поддерживает несколько стратегий реализации для сопоставления путей запроса с обработчиками контроллера. Ранее он поддерживал только стратегии AntPathMatcher.,но现существовать还поставлятьPathPatternParser。Spring Теперь Boot предоставляет свойство конфигурации для выбора новой стратегии:

Язык кода:javascript
копировать
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)。

ConfigurableWebBindingInitializer

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текстилианомальныйтип,Как показано ниже:

Язык кода:javascript
копировать
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извыражать。

в некоторых случаях,Ошибки обработки на уровне контроллера не регистрируются метриками.,Установив обработку исключения в качестве атрибута запроса,Программа приложения гарантирует, что такие исключения регистрируются вместе с метриками запросов.

Язык кода:javascript
копировать
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-файлом, структура будет следующей:

Язык кода:javascript
копировать
src/
 +- main/
     +- java/
     |   + <source code>
     +- resources/
         +- public/
             +- error/
             |   +- 404.html
             +- <other public assets>

Используйте шаблон FreeMark для сопоставления всех ошибок 5xx со следующей структурой:

Язык кода:javascript
копировать
src/
 +- main/
     +- java/
     |   + <source code>
     +- resources/
         +- templates/
             +- error/
             |   +- 5xx.ftlh
             +- <other templates>

Для более сложного картографирования,可кдобавить ввыполнитьErrorViewResolverинтерфейсизbean,следующее:

Язык кода:javascript
копировать
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

За то, что не используете Spring MVCизприложениепрограмма,可к使использоватьErrorPageRegistrarинтерфейс直接зарегистрироватьсяErrorPages。Эта абстракция напрямую связана с лежащей в ее основеиз Встроенныйservletконтейнер一起使использовать,Прямо сейчас使没有Spring MVC DispatcherServlet Это также действительно.

Язык кода:javascript
копировать
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Планировщик,Как показано в следующем примере:

Язык кода:javascript
копировать
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Планировщиктип。

WAR部署серединаиз Обработка ошибок

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

Междоменное совместное использование ресурсов(CORS)да Зависит отбольшинство браузероввыполнитьизСпецификация W3C,Позволяет гибко указать, какие междоменные запросы разрешены.,Вместо того, чтобы использовать какой-то метод безопасности, менее сексуальный и слабый.,Например, IFRAME или JSONP.

Начиная с версии 4.2, Spring MVC поддерживает CORS. Весной Bootприложениепрограммасередина使использовать带有@CrossOriginаннотацияиз控制器метод,CORS不нуждатьсялюбой特定из Конфигурация。可к通过使использовать自определениеизaddCorsMappings(CorsRegistry)методзарегистрироватьсяWebMvcConfigurer bean-компонент для определения глобальной конфигурации CORS, как показано в следующем примере:

Язык кода:javascript
копировать
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/**");
            }

        };
    }

}

6.1.2 JAX-RS и Джерси

Если вы предпочитаете конечные точки REST из модели программирования JAX-RS,Вы можете использовать одну из доступных реализаций,而不даSpring MVC。JerseyиApache CXF开箱Прямо сейчасиспользовать。CXFВы обязаныприложениепрограмманачальство Вниз文середина Воля其ServletилиFilterЗарегистрируйтесь как@Bean。JerseyЕсть некоторые родныеизSpringподдерживать,Итак, мы все ещеSpring Boot обеспечивает поддержку автоматической настройки, а также средство запуска.

Чтобы начать работу с Джерси,请Воляspring-boot-starter-jerseyкак Зависимости,Затемтынуждаться一个типResourceConfigиз@Bean,Прорегистрируйте в нем все конечные точки,Как показано в следующем примере:

Язык кода:javascript
копировать
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ждать),Как показано в следующем примере:

Язык кода:javascript
копировать
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параметр。

6.1.3 Поддержка встроенного контейнера сервлетов

Для приложений сервлетов Spring Boot包括对ВстроенныйTomcatJettyиUndertowсерверизподдерживать。大多数развивать人员使использовать适当из“Starter”来Получать完全Конфигурацияиз Пример。По умолчанию,Встроенныйсерверсуществоватьport8080начальство监听HTTPпросить。

Сервлеты, фильтры и слушатели

При использовании встроенного контейнера сервлетов,Это можно сделать с помощью компонента Springbean или сканированиясервлета.,отservletспецификациясерединазарегистрироватьсяservlet、фильтри Все слушатели(нравитьсяHttpSessionListener)。

Уилл Сервлеты, фильтры и слушатели Регистрация на весну Beans

Всё как весна beanизServletFilterилиservlet*ListenerПример都зарегистрироватьсяво встроенном контейнере。нравиться果ты想существовать Конфигурация期间引использоватьapplication.propertiesсерединаизценить,Это может быть особенно удобно.

По умолчанию,Если контекст содержит только один сервлет,则Воля其картографирование到/。в несколькихservlet beanиз情况Вниз,bean名称использовать作路径префикс。фильтркартографирование到/*

Если сопоставление, основанное на соглашении, недостаточно гибко,ты可к使использоватьServletRegistrationBeanFilterRegistrationBeanи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.

зарегистрироватьсяFilterbeanБудьте осторожны, когда,потому что它们существоватьприложениепрограмма生命周期из早期就被初始化Понятно。нравиться果тынуждатьсязарегистрироваться与другой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нет эффекта,Вместо этого используйте встроенный механизм обнаружения контейнера.

ServletWebServerApplicationContext

Spring Boot 底层使использовать不同типизApplicationContext来поддерживать Встроенныйserveltконтейнер。ServletWebServerApplicationContextда一种特殊изWebApplicationContext,Он ищет одинServletWebServerFactory Компонент загружает сам себя. Обычно автоматическая конфигурацияTomcatServletWebServerFactoryJettyServletWebServerFactoryилиUndertowServletWebServerFactory

Обычно нет необходимости знать об этих классах реализации. Большинство приложений-программ являются автоматическими. конфигурацияиз,而且Волякорень据你изтребуют создания соответствующихизApplicationContextиServletWebServerFactory

ServletContext устанавливается во время процесса запуска сервера. потому что,ApplicationContextсерединаизbean无法使использоватьServletContextНадежная инициализация。решить эту проблемуиз一种методда ВоляApplicationContextкакbeanиз Зависимости注入,并仅существоватьнуждаться时доступServletContext。另一种методдасуществоватьсервер启动后使использовать回调。这可к使использоватьApplicationListenerЗаканчивать,оно слушаетApplicationStartedEvent,Как показано ниже:

Язык кода:javascript
копировать
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();
    }

}
Пользовательский встроенный контейнер Servelt

Можно использовать пружину Environmentсвойство Конфигурация常использоватьизservletконтейнер设置。в целом,ты Волясуществоватьapplication.propertiesили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 compression

Spring Boot изо всех сил старается раскрыть общие настройки, но это не всегда возможно. Для этих ситуаций,专использовать名称空间поставлять特定серверизсделанный на заказ(Видетьserver.tomcatиserver.undertow)。 Например, журналы доступа можно настроить с использованием определенных функций встроенного контейнера сервлетов.

Полный список,ВидетьServerPropertiesдобрый。

SameSite Cookies

Атрибут cookie SameSite может использоваться веб-браузерами для управления тем, отправляются ли файлы cookie в межсайтовых запросах и каким образом. Это свойство особенно важно для современных веб-браузеров, когда оно отсутствует, поскольку они начинают менять значение по умолчанию.

Если вы хотите изменить атрибут cookie сеанса изSameSite,你可к使использоватьserver.servlet.session.cookie.same-siteсвойство。这个свойство被автоматическая Поддерживается вариантами серверов Tomcat, Jetty и Undertow.

Например,нравиться果ты希望сессияcookieиметьNoneизSameSiteсвойство,ты可к Воляк Вниз内容добавить в到тыизapplication.propertiesилиapplication.yamlдокументсередина:

Язык кода:javascript
копировать
server.servlet.session.cookie.same-site=none

нравиться果ты想更改добавить в到HttpServletResponseиздругойcookieначальствоизSameSiteсвойство,ты可к使использоватьCookieSameSiteSupplierCookieSameSiteSupplierпередатьCookie,и может вернутьсяSameSiteценитьилиnull

Существует множество удобных заводских методов и методов фильтрации, которые позволяют быстро подобрать конкретные параметры. печенье. Например, добавьте следующее bean автоматически сопоставит имя с регулярным выражением myapp.* Матч из всех cookie приложение Lax из SameSite。

Язык кода:javascript
копировать
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издоступ,Сюда входит множество способов настройки параметров. В следующем примере показана программная настройка порта:

Язык кода:javascript
копировать
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);
    }

}

TomcatServletWebServerFactoryJettyServletWebSServerFactoryиUndertowServletWebSrverFactoryдаConfigurableServletWebServerFactoryиз专использовать变体,Они соответственноTomcat、JettyиUndertowпоставлять Понятно额外из自определениеsetterметод。к Вниз示例显示Понятнонравиться何自определениеTomcatServletWebServerFactory,Чтобы предоставить доступ к конкретным параметрам конфигурации Tomcat:

Язык кода:javascript
копировать
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()));
    }

}
Непосредственная настройка ConfigurationServletWebServerFactory

对ВнуждатьсятыотServletWebServerFactoryРасширятьизвыше级использовать例,Вы можете выставить такой тип bean-компонента самостоятельно.

Сеттеры предусмотрены для многих вариантов конфигурации. Если вам нужно сделать что-то более дифференцированное,Также предусмотрено несколько защищенных методов «крючков». Для получения дополнительной информации,ВидетьДокументация исходного кода

Ограничения JSP

Существуют некоторые ограничения на поддержку JSP при запуске программ с использованием встроенного контейнера сервлетов (и упакованного в виде исполняемого архива) из приложения Spring Boot.

  • С Джетти и Томкэтом,Если вы используете военную упаковку,это должно сработать。当使использоватьjava -jarПри запуске,Исполняемая война сработает,Также может быть развернут в любой стандартный контейнер. JSP не поддерживается при использовании исполняемых файлов jar.
  • Undertow не поддерживает JSP.
  • 创建自определениеerror.jsp页лапша不会крышкаОбработка ошибокиз Вид по умолчанию。应使использоватьПользовательская страница ошибоклапша

6.2 Адаптивные веб-приложения

Spring Загрузочные пропуска на весну Webfluxпоставлятьавтоматическая конфигурация,简化Понятно РеакцияWebприложениепрограммаизразвивать。

6.2.1 Spring WebFlux Framework

Spring WebFlux — это весна Framework В версии 5.0 представлен новый реактивный веб-фреймворк. с весной MVC отличается, он не требует сервлетов. API,Полностью асинхронен и неблокируется.,и пройтиПроект реакторавыполнитьReactive Streamsспецификация。

Spring WebFlux Существует две формы: функциональные изи, основанные на аннотациях из. Судя по аннотации, форма очень близка к Spring. Модель MVC, как показано ниже:

Язык кода:javascript
копировать
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» — функциональный вариант,Отделите настройку маршрутизации от фактической обработки запросов.,Как показано в следующем примере:

Язык кода:javascript
копировать
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();
    }

}
Язык кода:javascript
копировать
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 — часть фреймворка «Это весна».,Подробности можно найти на егоСправочная документациясередина找到。

ты可копределение任意数量изRouterFunctionbean,Определен модульным маршрутизатором из. Если вам нужно приоритетное приложение,Порядок бобов может быть определен.

Воля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 Ботинок на весну WebFluxпоставлять Понятноавтоматическая конфигурация,适использовать В大多数приложениепрограмма。

Автоматическая модификация добавляет следующие функции поверх Spring по умолчанию:

Если вы хотите сохранить весну Boot WebFluxФункция,并想добавить в额外изКонфигурация WebFlux,ты可кдобавить в自己изWebFluxConfigurerтипиз@Configurationдобрый,ноНе добавлять@EnableWebFlux

Если вы хотите полный контроль над Spring WebFlux,可кдобавить в自己из@Configuration,并использовать@EnableWebFluxотметка。

HTTP-кодеки с HttpMessageReaders и HttpMessageWriters

Spring WebFlux 使использоватьHttpMessageReaderиHttpMessageWriterинтерфейс для конвертацииHTTPпроситьиответ。 они используют CodecConfigurer Разумные значения по умолчанию настроены так, что этого можно достичь, просмотрев доступные библиотеки в вашем пути к классам.

Spring Bootпоставлять专использоватьизкодек Конфигурациясвойствоspring.codec.*,它还通过使использоватьCodecCustomizerПример来进一步自определение。Например,spring.jackson.*Конфигурация密钥приложение ВJacksonкодек。

Если вам нужно добавить собственный кодек,ты可к创建自определениеCodecCustomizerкомпоненты,Как показано в следующем примере:

Язык кода:javascript
копировать
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/**可квыполнитьк Вниз操作:

Язык кода:javascript
копировать
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.,Как показано в следующем примере:

Язык кода:javascript
копировать
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();
    }

}

6.2.2 Поддержка встроенной службы реагирования

Spring Boot включает поддержку следующих встроенных реактивных веб-серверов: Reactor. Netty、Tomcat、JettyиUndertow。大多数развивать人员使использовать适当из“Starter”来Получать完整Конфигурацияиз Пример。По умолчанию,Встроенный сервер прослушивает HTTP-запросы на порту 8080.

6.2.3 Конфигурация ресурсов адаптивной службы

При автоматической настройке Reactor Сервер NettyилиJetty, Spring Boot создаст конкретный bean-компонент,向сервер ПримерпоставлятьHTTPресурс:ReactorResourceFactoryилиJettyResourceFactory

По умолчанию эти ресурсы также будут использоваться с Reactor. NettyиJettyклиент共享,для лучшей производительности,Данный:

  • На сервере и клиенте используется одна и та же технология.
  • Экземпляр клиента использует Spring Bootавтоматическая конфигурацияизWebClient.Builder бобовая конструкция

развивать人员可к通过поставлять自определениеReactorResourceFactoryилиJettyResourceFactory Компонент для переопределения конфигурации ресурсов JettyиReactorNettyиз, приложение на клиенте и сервере.

ты可ксуществоватьЧасть времени выполнения веб-клиентаПонятно解有关клиентресурс Конфигурацияиз Дополнительная информация。

6.3 Грамотное завершение работы

Все четыре встроенных веб-сервера (Jetty, Reactor Netty, Tomcat и Undertow), а также реактивные и сервлетные программы, а также веб-приложения поддерживаются. завершение работы。它как关闭приложениепрограмманачальство Вниз文изчасть этого происходит,并существовать停止SmartLifecycleиз Исполнение на самой ранней стадии。此停止иметь дело с使использовать超时,Этот тайм-аут обеспечивает льготный период,в этот период,Существующим запросам будет разрешено завершиться,но不允许新изпросить。不允许新проситьиз确切方式因正существовать使использоватьиз网络сервер而异。Jetty、Reactor NettyиTomcat перестанет принимать запросы на сетевом уровне. Undertow примет запрос, но немедленно ответит ответом «Служба недоступна» (503).

Tomcatиз Плавное завершение работынуждатьсяTomcat 9.0.33иливыше Версия。

Чтобы включить Плавное завершение работы,请Конфигурацияserver.shutdownсвойство,Как показано в следующем примере:

Язык кода:javascript
копировать
server.shutdown=graceful

Чтобы настроить период ожидания,请Конфигурацияspring.lifecycle.timeout-per-shutdown-phaseсвойство,Как показано в следующем примере:

Язык кода:javascript
копировать
spring.lifecycle.timeout-per-shutdown-phase=20s

нравиться果IDEНе верно отправленоизSIGTERMСигнал,Тогда использование корректного завершения работы в IDE может работать некорректно. Для более подробной информации,Увидимся из IDE-документа.

6.4 Spring Security

нравиться果Spring Securityсуществоватьдобрый路径начальство,ТакWebприложениепрограмма По умолчаниюда Безопасностьиз。Spring Загрузка зависит от Spring Securityиз内容协商Стратегия来决定да使использоватьhttpBasic还даformLogin。кWebприложениепрограммадобавить вметод级Безопасностьсекс,ты还可к使использовать所需из设置добавить в@EnableGlobalMethodSecurity。Дополнительная информация可ксуществоватьSpring Securityссылкагидсередина找到。

По умолчанию изUserDetailsService只有一个использовать户。использовать户名даuser,Пароль случайный из,Печать на уровне WARN при запуске программы приложения,Как показано в следующем примере:

Язык кода:javascript
копировать
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)。
  • Вся программа приложения (если привод находится в пути к классам),затем включаетactuatorконечная точка)изна основе表单из АвторизоватьсяилиHTTPБазовый Безопасностьсекс(取决ВпроситьсерединаизAccept标голова)。
  • использовать В发布身份验证事件изDefaultAuthenticationEventPublisher

ты可к通过для其добавить вbean来поставлять不同изAuthenticationEventPublisher

MVC-безопасность

по умолчанию Безопасность КонфигурациясуществоватьSecurityAutoConfigurationиUserDetailsServiceAutoConfigurationсерединавыполнить。SecurityAutoConfiguration会импортироватьиспользовать ВwebБезопасностьизSpringBootWebSecurityConfigurationиUserDetailsServiceAutoConfigurationиспользовать ВКонфигурация身份验证,Это также относится к программам, не являющимся веб-приложениями. Чтобы полностью отключить конфигурацию безопасности программы Webприложения по умолчанию или объединить несколько компонентов Spring Security,Например, клиент OAuth2 и сервер ресурсов.,请добавить вSecurityFilterChainтипизbean(так做不会禁использоватьUserDetailsServiceКонфигурацияилиприводиз Безопасностьсекс)。

закрытьUserDetailsServiceКонфигурация,ты可кдобавить вUserDetailsServiceAuthenticationProviderилиAuthenticationManagerтипизbean。

可к通过добавить в自определениеSecurityFilterChainилиWebSecurityConfigurerAdapter来крышкадоступ规则。Spring Bootпоставлять Понятно方便изметод,可использовать Вкрышкаactuatorконечная точкаистатическийресурсиздоступ规则。EndpointRequest可использовать В创建на основеmanagement.endpoints.web.base-pathсвойствоизRequestMatcherPathRequest可использовать Вдля常использовать Расположениеизресурс创建RequestMatcher

Безопасность WebFlux

с весной 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。

Например, вы можете настроить конфигурацию безопасности, добавив следующее:

Язык кода:javascript
копировать
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

OAuth2да一个广泛使использоватьиз Структура авторизации

Client

нравиться果тыиздобрый路径начальство有spring-security-oauth2-client,ты可к利использовать一些автоматическая Инструмент для настройки OAuth2/Open ID Connectклиент。此Конфигурация使использоватьOAuth2ClientPropertiesВнизизсвойство。такой жеизсвойство适использовать Вservletиreactiveприложениепрограмма。ты可ксуществоватьspring.security.oauth2.clientпрефикс Вниззарегистрироваться多个OAuth2клиентипоставлять商,Как показано в следующем примере:

Язык кода:javascript
копировать
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 Подключить провайдера:

Язык кода:javascript
копировать
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

Язык кода:javascript
копировать
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

Для распространенных провайдеров изOAuth2иOpenID,Включая Google, Github, Facebook и Okta.,我们поставлять一组поставлять商по умолчаниюценить(分别дляgooglegithubfacebookиokta)。

Если вам не нужно настраивать этих поставщиков,ты可к Воляproviderсвойствоустановлен нануждаться推断по умолчаниюценитьизпоставлятьпрограмма。также,Если ключ регистрации клиента соответствует ключу, поддерживаемому по умолчанию поставщиком,Spring Boot также сделает это вывод.

Обе конфигурации в следующих примерах используют поставщиков Google:

Язык кода:javascript
копировать
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
Resource Server

нравиться果тыиздобрый路径начальство有spring-security-oauth2-resource-server,Spring Boot может настроить сервер ресурсов OAuth2. Для конфигурации JWT необходимо указать JWK. Set URIилиOIDC Issuer URI, как показано в следующем примере:

Язык кода:javascript
копировать
spring.security.oauth2.resourceserver.jwt.jwk-set-uri=https://example.com/oauth2/default/v1/keys
Язык кода:javascript
копировать
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из вы можете настроить следующие свойства для проверки токена посредством самоанализа:

Язык кода:javascript
копировать
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

Authorization Server

В настоящее время весна Безопасность не реализует OAuth 2.0授权сервер。Однако,此Функция可отSpring Security OAuth项глаз获得,В конечном итоге проект будет полностью реализован Spring Security. до этого,ты可к使использоватьspring-security-oauth2-autoconfigureмодуль设置OAuth 2.0授权сервер;Инструкции,Видеть其документ

Примечание автора: 笔ВОЗ有一关ВSpring Security OAuth2 Похожие из рубрик, добро пожаловать к прочтению

SAML 2.0
доверяющая сторона

нравиться果тыиздобрый路径начальство有spring-security-saml2-service-provider,ты可к利использовать一些автоматическая конфигурацияустановитьSAML 2.0доверяющая сторона。此Конфигурация使использоватьSaml2RelyingPartyPropertiesВнизизсвойство。

доверяющая стороназарегистрироваться代表身份поставлять商IDPи服务поставлять商SPмеждуиз配对Конфигурация。ты可ксуществоватьspring.security.saml2.relyingpartyпрефикс Вниззарегистрироваться多个доверяющая сторона,Как показано в следующем примере:

Язык кода:javascript
копировать
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

Язык кода:javascript
копировать
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();
    }

}

6.5 Spring Session

Spring Bootдля各种данные存储поставлятьSpring Sessionавтоматическая форма. Создание сервлета Программа Webприложение может автоматическая В памяти хранятся:

  • JDBC
  • Redis
  • Hazelcast
  • MongoDB

Кроме того, Spring Boot Apache Geode обеспечивает автоматическую настройку Apache Geode в качестве хранилища сеансов.

servletавтоматическая конфигурация取代Понятно使использовать@Enable*HttpSessionизнуждаться。

существовать构建Реакция Программа Webприложение может автоматическая В памяти хранятся:

  • Redis
  • MongoDB

Реакцияавтоматическая конфигурация取代Понятно使использовать@Enable*WebSessionизнуждаться。

Spring Boot автоматически будет использовать эту реализацию хранилища. Если у вас есть несколько реализаций,则必须выбирать要использовать В存储сессияизStoreType。Например,Использование JDBC в качестве внутреннего хранилища,Вы можете настроить программу приложения следующим образом:

Язык кода:javascript
копировать
spring.session.store-type=jdbc

可к Воляstore-typeустановлен наnone来禁использоватьSpring Session

Каждое хранилище имеет определенныеиз Дополнительные настройки。Например,Вы можете настроить имя таблицы хранения JDBC.,Как показано в следующем примере:

Язык кода:javascript
копировать
spring.session.jdbc.table-name=SESSIONS

Чтобы установить тайм-аут сеанса,ты可к使использоватьspring.session.timeoutсвойство。нравиться果该свойство没有существоватьservlet Устанавливаем в программе Вебприложение, далее автоматическая конфигурация Возврат кserver.servlet.session.timeoutизценить。

可к使использовать@Enable*HttpSession(servlet)или@Enable*WebSession(Реакция)контролироватьSpring Настройка сессии, результатом которой станет автоматическая После резервного копирования вы можете настроить Spring, используя аннотацию свойств вместо ранее описанных свойств конфигурации. Session。

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose