JavaRush /Kurslar /All lectures for UZ purposes /Joylashtirilgan Servisli konteynerini qo'llab-quvvatlash

Joylashtirilgan Servisli konteynerini qo'llab-quvvatlash

All lectures for UZ purposes
Daraja, Dars
Mavjud

Spring Boot servisli ilovalari uchun joylashtirilgan serverlarni qo'llab-quvvatlaydi Tomcat, Jetty, va Undertow. Ko'pchilik dasturchilar mos "starter" dan foydalanib to'liq sozlangan namunani olishadi. Odatiy bo'lib joylashtirilgan server 8080 porti orqali HTTP-so'rovlarni tinglaydi.

Servislar, filtrlar va tinglovchilar

Joylashtirilgan servis konteyneridan foydalanganda servislar, filtrlar va har qanday tinglovchilarni (masalan, HttpSessionListener) yo ularga Spring beanlar orqali ro'yxatdan o'tkazish yoki servis komponentlarini skanerlash orqali ro'yxatdan o'tkazishingiz mumkin.

Spring beanlar sifatida servislar, filtrlar va tinglovchilarni ro'yxatga olish

Spring bean bo'lgan har qanday Servlet, Filter yoki *Listener servisi joylashtirilgan konteynerda ro'yxatga olinadi. Agar application.properties dan qiymatga murojaat qilish kerak bo'lsa, bu ayniqsa qulay bo'lishi mumkin.

Odatiy bo'lib, agar kontekst ichida faqat bitta servis bo'lsa, u / da ko'rinadi. Bir necha servis-beanlar bo'lsa, bean nomi yo'l prefiksi sifatida ishlatiladi. Filtrlar /* da ko'rinadi.

Agar kelishilgan ko'rinish juda mos kelmasa, unda ServletRegistrationBean, FilterRegistrationBean va ServletListenerRegistrationBean kabi sinflardan to'liq nazorat qilish uchun foydalanishingiz mumkin.

Odatda, bean-filtr tartibini tartibga solmasdan qoldirishingiz mumkin. Agar ma'lum bir tartib kerak bo'lsa, Filter ni @Order annotatsiyasi yordamida annotatsiya qilishingiz kerak yoki uni Ordered sinfi sifatida amalga oshirishingiz kerak. Filter ning tartibini bean metodi bilan @Order annotatsiyasi yordamida sozlash mumkin emas. Agar Filter sinfini o'zgartirib bo'lmasa va @Order annotatsiyasini qo'sha olmaydigan bo'lsangiz yoki Ordered sinfini amalga oshira olmasangiz, FilterRegistrationBean ni Filter uchun aniqlang va registratsiya bean tartibini setOrder(int) metod yordamida o'rnating. Ordered.HIGHEST_PRECEDENCE bo'yicha so'rov tanasini o'qiydigan filtrni sozlashdan saqlaning, chunki u sizning ilovangiz kodlashini buzishi mumkin. Agar servis filtri so'rovni o'ralashsa, uni bajarish tartibi OrderedFilter.REQUEST_WRAPPER_FILTER_MAX_ORDER dan katta yoki teng bo'lishi kerak.

Har bir Filter ning ilova ichida qaysi tartibda bajarilishini ko'rish uchun web-log guruhiga mos keladigan logni yoqing ( logging.level.web=debug). Ro'yxatga olingan filtrlar, ularning tartibi va URL-manzil shablonlari haqida batafsil ma'lumot ilova ishga tushirilganda ro'yxatga olinadi.
Filtir beanlarini ro'yxatga olayotganda ehtiyot bo'ling, chunki ularning namunasi ilovaning hayotiy tsiklida juda erta yaratiladi. Agar boshqa beanlar bilan o'zaro ta'sir qiladigan filtirni ro'yxatga olish kerak bo'lsa, uning o'rniga DelegatingFilterProxyRegistrationBean dan foydalaning.

Servis kontekstini ishga tushirish

Joylashtirilgan servis konteynerlari to'g'ridan-to'g'ri javax.servlet.ServletContainerInitializer yoki Spring dan org.springframework.web.WebApplicationInitializer interfeysini bajarmaydi. Bu Spring Boot ilovalarini buzilish ehtimolini kamaytirish maqsadida o'ylangan dizayn qarori.

Agar Spring Boot ilovasida servis kontekstini ishga tushirish kerak bo'lsa, org.springframework.boot.web.servlet.ServletContextInitializer interfeysini amalga oshiruvchi bean ni ro'yxatga olish kerak. onStartup yagona metod ServletContext ga kirishni ta'minlaydi va kerak bo'lganda mavjud WebApplicationInitializer uchun adapter sifatida osongina ishlatilishi mumkin.

Servislar, filtrlar va tinglovchilarni skanerlash

Joylashtirilgan konteynerdan foydalanganda @WebServlet, @WebFilter va @WebListener annotatsiyalari bilan belgilangan sinflarni avtomatik ro'yxatga olishni @ServletComponentScan annotatsiyasi orqali faollashtirish mumkin.

@ServletComponentScan avtonom konteynerda ishlamaydi, u erda joylashtirish mexanizmlari o'rniga qo'llaniladi.

The ServletWebServerApplicationContext

Spring Boot ning ichki tuzilishi nuqtai nazaridan joylashtirilgan servis konteynerini qo'llab-quvvatlash uchun boshqa turdagi ApplicationContext dan foydalaniladi. ServletWebServerApplicationContext - bu o'z-o'zidan yuklanib, ServletWebServerFactory ning yagona beanini qidiradigan maxsus turdagi WebApplicationContext. Odatda TomcatServletWebServerFactory, JettyServletWebServerFactory yoki UndertowServletWebServerFactory avtomatik tarzda sozlaniladi.

Ko'p hollarda ushbu sinflar haqida bilishga hojat yo'q. Ko'pchilik ilovalar avtomatik sozlanadi va mos ApplicationContext va ServletWebServerFactory sizning ishtirokingizsiz yaratiladi.

Joylashtirilgan konteynerni sozlashda ServletContext ilova konteksti ishga tushirilayotganda serverni ishga tushirish elementi sifatida o'rnatiladi. Shuning uchun ApplicationContext ichidagi beanlar ServletContext yordamida ishonchli ravishda ishga tushirib bo'lmaydi. Ushbu cheklovni aylanib o'tishning bir usuli - bean da ApplicationContext ni bog'liq arifat sifatida kiritish va ServletContext ga faqat kerak bo'lganda murojaat qilish. Boshqa usul - serverni ishga tushirishdan keyin darhol chaqiriladigan qo'ng'iroqdan foydalanish. Buni quyidagi kabi ApplicationStartedEvent ni tinglaydigan ApplicationListener yordamida amalga oshirish mumkin:

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(); } } 

Joylashtirilgan servis konteynerlarining sozlamalarini moslashtirish

Servisli konteynerning umumiy parametrlarini Spring dan Environment xususiyatlari yordamida sozlash mumkin. Odatda, xususiyatlar application.properties yoki application.yaml faylida aniqlanadi.

Umumiy server parametrlariga quyidagilar kiradi:

  • Tarmoq parametrlari: HTTP-so'rovlarni tinglash uchun port (server.port), bog'lanish uchun interfeys manzili (server.address) va hokazo.

  • Sessiya parametrlari: sessiya uzayib saqlanadimi (server.servlet.session.persistent), sessiya kutish vaqti (server.servlet.session.timeout), sessiya ma'lumotlarining joylashuvi (server.servlet.session.store-dir) va sessiya cookie-konfiguratsiyasi (server.servlet.session.cookie.*).

  • Xatolarni boshqarish: xato sahifasining joylashuvi (server.error.path) va hokazo.

  • SSL

  • HTTP-siqish

Spring Boot kimmosh keladigan eng ko'p umumiy sozlamalarga kirish imkonini beradi, lekin bu har doim ham mumkin emas. Bunday hollarda, serverga xos sozlamalar maxsus nomzod iboralari bilan ta'minlanadi (masalan, server.tomcat va server.undertow). Misol uchun, kirish jurnallarini joylashtirilgan servis konteynerining o'ziga xos xususiyatlarini hisobga olgan holda sozlash mumkin.

To'liq ro'yxatni ServerProperties sinfida ko'ring.

SameSite atributo uchun cookie-lar

Veb-brauzerlar SameSite atributidan cookie-lar uchun foydalanishi mumkin, ularni boshqa saytlararo so'rovlar paytida uzatish yoki qanday qilib uzatilishini boshqarish uchun. Atribut ayniqsa zamonaviy veb-brauzerlar uchun muhimdir, qaysi biri atribut bo'lmaganda foydalaniladigan standart qiymatni o'zgartira boshladi.

Agar siz sessiya cookie-laringiz SameSite atributini o'zgartirmoqchi bo'lsangiz, server.servlet.session.cookie.same-site xususiyatidan foydalanishingiz mumkin. Ushbu xususiyat avtomatik sozlanadigan Tomcat, Jetty va Undertow serverlar tomonidan qo'llab-quvvatlanadi. U, shuningdek, serviset asosidagi SessionRepository beanlarini sozlash uchun ishlatiladi.

Misol uchun, agar sessiya cookie-laringizda SameSite atributining qiymati None bo'lishi kerak bo'lsa, quyidagi kodni application.properties yoki application.yaml fayliga qo'shishingiz mumkin:

Properties
server.servlet.session.cookie.same-site=none
Yaml
server:
  servlet:
    session:
      cookie:
        same-site: "none"

Agar HttpServletResponse ga qo'shilgan boshqa cookie-lar uchun SameSite atributini o'zgartirmoqchi bo'lsangiz, CookieSameSiteSupplier dan foydalanishingiz mumkin. CookieSameSiteSupplier Cookie ga uzatiladi va SameSite qiymatini yoki null ni qaytarishi mumkin.

Ma'lum cookie-larni tezda topish uchun bir qator yordamchi fabrika va filtratsiya usullari mavjud. Misol uchun, quyidagi beanni qo'shish avtomatik ravishda Lax SameSite ni myapp.* nomiga mos keladigan barcha cookie-larga qo'llaydi.

Java
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.*"); } } 
Kotlin
import org.springframework.boot.web.servlet.server.CookieSameSiteSupplier import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration @Configuration(proxyBeanMethods = false) class MySameSiteConfiguration { @Bean fun applicationCookieSameSiteSupplier(): CookieSameSiteSupplier { return CookieSameSiteSupplier.ofLax().whenHasNameMatching("myapp.*") } } 

Dasturiy sozlash

Agar joylashtirilgan servis konteynerni dasturiy sozlashingiz kerak bo'lsa, WebServerFactoryCustomizer interfeysini amalga oshiradigan Spring beanini ro'yxatga olish mumkin. WebServerFactoryCustomizer ConfigurableServletWebServerFactory ga kirishni ta'minlaydi, u ko'plab o'rnatuvchilarga ega. Quyidagi misol portni dasturiy sozlashni ko'rsatadi:

Java
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); } } 
Kotlin
import org.springframework.boot.web.server.WebServerFactoryCustomizer import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory import org.springframework.stereotype.Component @Component class MyWebServerFactoryCustomizer : WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> { override fun customize(server: ConfigurableServletWebServerFactory) { server.setPort(9000) } } 

TomcatServletWebServerFactory, JettyServletWebServerFactory va UndertowServletWebServerFactory - bu maxsus ConfigurableServletWebServerFactory variantlari, ular Tomcat, Jetty va Undertow uchun qo'shimcha o'rnatuvchilarga ega. Quyidagi misol Tomcat bilan bog'liq konfiguratsiya parametrlari imkonini beradigan TomcatServletWebServerFactory ni sozlashni ko'rsatadi:

Java
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())); } } 
Kotlin
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory import org.springframework.boot.web.server.WebServerFactoryCustomizer import org.springframework.stereotype.Component import java.time.Duration @Component class MyTomcatWebServerFactoryCustomizer : WebServerFactoryCustomizer<TomcatServletWebServerFactory> { override fun customize(server: TomcatServletWebServerFactory) { server.addConnectorCustomizers({ connector -> connector.asyncTimeout = Duration.ofSeconds(20).toMillis() }) } } 

ConfigurableServletWebServerFactory ni to'g'ridan-to'g'ri sozlash

Qo'llanilishida kengaytirishni talab qiladigan ba'zi murakkab holatlar mavjud bo'lsa, ServletWebServerFactory ni o'z ichiga oladigan bean ochishingiz mumkin.

Ko'pgina konfiguratsiya parametrlari uchun o'rnatuvchilar mavjud. Shuningdek, bir nechta "perexvatchilar" himoyalangan usullar uchun mavjud, agar siz biror narsa qilsangiz. Batafsil ma'lumot uchun manba kodidagi hujjatlar ni tekshiring.

Avtomatik sozlangigan modullar sizning maxsus fabrikangizga hali ham qo'llaniladi, shuning uchun bu opsiyani ehtiyotkorlik bilan ishlatish kerak.

JSP cheklashlari

Joylashtirilgan servis konteyneridan foydalanadigan va ishga tushiriladigan arxiv sifatida qadoqlangan Spring Boot ilovasini ishga tushirganda, JSP ni qo'llab-quvvatlash vositalarida ba'zi cheklashlar mavjud.

  • Jetty va Tomcatda, agar siz ur-fayl qadoqlashidan foydalansangiz, hamma narsa ishlashi kerak. Ishga tushiriladigan ur-fayl java -jar orqali ishga tushirilganda va har qanday standart konteynerda ishga tushirilganda ishlaydi. JSP sahifalari ishga tushiriladigan jar-fayldan foydalanishda qo'llab-quvvatlanmaydi.

  • Undertow JSP sahifalarini qo'llab-quvvatlamaydi.

  • Maxsus error.jsp ishlab chiqish standart xato ko'rinishini o'zgartirmaydi. Buning o'rniga, maxsus xato sahifalaridan foydalanishingiz kerak.

Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION