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.
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.
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.
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:
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.
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:
server.servlet.session.cookie.same-site=none
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.
@Configuration(proxyBeanMethods = false) public class MySameSiteConfiguration { @Bean public CookieSameSiteSupplier applicationCookieSameSiteSupplier() { return CookieSameSiteSupplier.ofLax().whenHasNameMatching("myapp.*"); } }
@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:
@Component public class MyWebServerFactoryCustomizer implements WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> { @Override public void customize(ConfigurableServletWebServerFactory server) { server.setPort(9000); } }
@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:
@Component public class MyTomcatWebServerFactoryCustomizer implements WebServerFactoryCustomizer<TomcatServletWebServerFactory> { @Override public void customize(TomcatServletWebServerFactory server) { server.addConnectorCustomizers((connector) -> connector.setAsyncTimeout(Duration.ofSeconds(20).toMillis())); } }
@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.
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 -jarorqali 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.jspishlab chiqish standart xato ko'rinishini o'zgartirmaydi. Buning o'rniga, maxsus xato sahifalaridan foydalanishingiz kerak.
GO TO FULL VERSION