Spring Boot: Çapraz Etki Alanı Sorunları Nasıl Çözülür
İlgili Etiketler:1. Alan Adı Çözümleme Nedir ve Nasıl Çalışır?
2. Alibaba Cloud DNS
Spring Boot çapraz etki alanı sorunlarına giriş
Çapraz etki alanı sorununun nedeni: Tarayıcı, güvenlik nedeniyle bu sitenin erişimine izin verdiği kaynaklara erişimi kısıtlar.
CORS politikası tarafından engellendi: İstenen kaynakta 'Access-Control-Allow-Origin' üst bilgisi bulunmuyor.
Yukarıdaki mesaj, CORS protokolü tarafından engellenen bir kaynağa eriştiğinizi ve Header içinde Access-Control-Allow-Origin parametresinin bulunmadığını gösterir.
Çapraz etki alanı sorunu analizi
Çapraz etki alanı sorununun nedeni: Tarayıcı, güvenlik nedeniyle bu sitenin erişimine izin verdiği kaynaklara erişimi kısıtlar.
Örneğin, 127.0.0.1:8080/ adresinde bir web siteniz varsa ve üzerinde bir sayfa barındırılıyorsa, bu sayfada aynı sitenin kaynaklarına erişiminiz kısıtlanmaz. Ancak 127.0.0.1:8081 gibi başka sitelere ait kaynaklara erişim sınırlanır.
Not: Protokol, alan adı ve bağlantı noktası aynı olduğunda aynı site olarak kabul edilir.
Spring Boot çapraz etki alanı sorunları. Ancak src özniteliğine sahip img, script gibi etiketler bu kısıtlamaya tabi değildir.
Geçmişte, eski programlarda ön uç ve arka uç ayrılmamıştı; sayfa ve istek arayüzü aynı alan adı ve aynı bağlantı noktası altındaydı. Tüm tarayıcılar, aynı siteden gelen sayfanın aynı sitenin arayüzünü istemesine uzun süre izin vermiştir.
Spring Boot çapraz etki alanı sorunları. Örneğin, 127.0.0.1:8080/index.html sayfasından 127.0.0.1:8080/a/b/c/userList arayüzüne istek göndermek mümkündür.
Günümüzde ise ön uç ve arka uç ayrıştırılmıştır; sayfa ve arayüz genellikle aynı programda değildir, bu nedenle bu duruma izin verilmez ve bu istisna fırlatılır.

Kaynak (origin); protokol, alan adı ve bağlantı noktası numarasından oluşur.
Bir URL; protokol, alan adı, bağlantı noktası ve yoldan oluşur. İki URL'nin protokolü, alan adı ve bağlantı noktası tamamen aynıysa aynı kaynaktadırlar. Aksi takdirde, protokolden, alan adından veya bağlantı noktasından herhangi biri farklıysa çapraz etki alanı söz konusudur.
https://www.baidu.com/index.html için çapraz etki alanı karşılaştırması:
Aynı Kaynak Politikası Nedir?
Aynı kaynak politikası bir sözleşmedir. Tarayıcının çekirdeğini ve en temel güvenlik işlevini oluşturur. Aynı kaynak politikası olmazsa tarayıcının normal işlevleri etkilenebilir. Web'in aynı kaynak politikası temelinde inşa edildiği söylenebilir; tarayıcı yalnızca bu politikanın bir uygulamasıdır.
Aynı kaynak politikası şu iki türe ayrılır:
1.DOM aynı kaynak politikası: Farklı kaynaklardaki sayfaların DOM'ları üzerinde işlem yapılması yasaktır. Buradaki ana senaryo iframe çapraz etki alanı durumudur; farklı alan adlarına sahip iframe'lerin birbirlerine erişimi kısıtlanır.
2.XMLHttpRequest Aynı Kaynak Politikası: XHR nesnelerini kullanarak farklı kaynaklardaki sunucu adreslerine HTTP isteği gönderilmesi yasaktır.
Spring Boot: Çapraz etki alanı sorunu çözümü
1. Spring Boot çapraz etki alanı sorunları. Çapraz etki alanını çözmek için filtre oluşturma
Projenin bileşenleri ayrı ayrı dağıtıldığından çapraz etki alanı sorunlarının çözülmesi gerekir. Kullanıcı oturum açma bilgilerini saklamak için çerezleri kullanıyoruz ve izinleri Spring kesicisinde kontrol ediyoruz. İzinler eşleşmediğinde kullanıcıya doğrudan sabit JSON sonucunu döndürüyoruz. Kullanıcı oturum açtığında sistem normal şekilde çalışır; kullanıcı oturumu kapattığında veya jeton süresi dolduğunda, kesici sırası ve çapraz etki alanı sorunundan dolayı çapraz etki alanı fenomeni ortaya çıkar. Bir HTTP isteğinin önce filtreye ulaştığını, ardından servlet'e geldikten sonra kesici tarafından işlendiğini biliyoruz. CORS'u filtreye yerleştirirsek, izin kesicisinden önce öncelikli olarak çalıştırılabilir.
@Configuration
public class CorsConfig {
@Bean
public CorsFilter corsFilter() {
CorsConfiguration corsConfiguration = new CorsConfiguration();
corsConfiguration.addAllowedOrigin("*");
corsConfiguration.addAllowedHeader("*");
corsConfiguration.addAllowedMethod("*");
corsConfiguration.setAllowCredentials(true);
UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);
return new CorsFilter(urlBasedCorsConfigurationSource);
}
}
2. WebMvcConfigurerAdapter yapılandırmasına dayalı olarak CORS ile çapraz etki alanı çözümü
Çapraz etki alanı ön uçta JSONP ile çözülebilir, ancak JSONP yalnızca GET istekleri gönderebilir ve diğer istek türlerini gönderemez. Bu durum RESTful tarzı uygulamalarda oldukça yetersizdir, bu nedenle çapraz etki alanı sorunlarını çözmek için arka uçta CORS (Cross-Origin Resource Sharing) kullanılmasını öneriyoruz. Bu çözüm Spring Boot'a özgü değildir. Geleneksel SSM çerçevesinde de CORS, çapraz etki alanı sorunlarını çözmek için kullanılabilirdi, ancak eskiden CORS'u XML dosyalarında yapılandırırdık. Artık WebMvcConfigurer arayüzünü uygulayıp addCorsMappings yöntemini yeniden yazarak çapraz etki alanı sorunlarını çözebiliriz.
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowCredentials(true)
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
.maxAge(3600);
}
}
3. Denetleyici için CORS yapılandırması
Denetleyici yöntemi için CORS yapılandırmasında, CORS'u etkinleştirmek amacıyla @RequestMapping ek açıklama işleyici yöntemine bir @CrossOrigin ek açıklaması ekleyebilirsiniz (varsayılan olarak @CrossOrigin, @RequestMapping ek açıklamasında belirtilen tüm kaynaklara ve HTTP yöntemlerine izin verir):
@RestController _
@RequestMapping ( " / account" )
public class AccountController {
@CrossOrigin _
@ GetMapping ( "/ {id}" )
public Account retrieve ( @ PathVariable) Long id )
// ...
A
@ DeleteMapping ( "/ {id}" )
public void remove ( @PathVariable _ Long id ) {
// ...
}
}
@CrossOrigin içindeki parametreler:
@CrossOrigin, tüm URL'lerin bu kaynağa erişebileceğini belirtir. @CrossOrigin ( origins = " http://127.0.0.1:8080")//Yalnızca bu URL'nin bu denetleyiciye çapraz etki alanı üzerinden erişmesine izin verildiğini belirtir. Kod açıklaması: @CrossOrigin ek açıklamasının kullanımı çok pratiktir; hem yöntemlerde hem de sınıflarda kullanılabilir. Value özniteliğini veya origins özniteliğini ayarlamazsanız, varsayılan olarak tüm URL/alan adı erişimine izin verilir.
1.Value özniteliği birden fazla URL ayarlayabilir.
2.Origins özelliği de birden fazla URL ayarlayabilir.
3.MaxAge özelliği, yanıt hazırlanmadan önce önbelleğin ne kadar süreyle geçerli olacağını belirtir. Bu, yoklama isteğinin geçerlilik süresidir.
4.AllowCredentials özelliği, kullanıcının çerez gönderip gönderemeyeceğini ve işleyip işleyemeyeceğini belirtir. Varsayılan değer false'tur.
5.AllowedHeaders özelliği hangi istek üst bilgilerinin izin verildiğini belirtir.
6.Methods özelliği istek için izin verilen yöntemleri belirtir; varsayılan olarak get, post, head'tir.
@CrossOrigin'in çalışmamasının nedenleri
1. @CrossOrigin'i desteklemek için springMVC sürümünün 4.2 veya üzeri olması gerekir.
2. @CrossOrigin olmayan durumlar çapraz etki alanı istek sorununu çözmemiştir, ancak hatalı bir istek beklenen yanıtın alınamamasına neden olarak tarayıcının çapraz etki alanı sorunu uyarısı vermesine yol açmıştır.
Controller ek açıklamasının üzerine @CrossOrigin ek açıklaması eklendiğinde bile çapraz etki alanı sorunu devam edebilir. Çözümlerden biri şudur:
@RequestMapping ek açıklamasında Get ve Post yöntemleri belirtilmemiştir. Bunlar belirtildikten sonra sorun çözülmüştür.
Benzer kod aşağıdaki gibidir:
@CrossOrigin _
@RestController _
public class person {
@RequestMapping ( method _ = RequestMethod.GET ) _ _
public String add ( ) {
// some code
}
}
2. Alibaba Cloud DNS
Spring Boot çapraz etki alanı sorunlarına giriş
Çapraz etki alanı sorununun nedeni: Tarayıcı, güvenlik nedeniyle bu sitenin erişimine izin verdiği kaynaklara erişimi kısıtlar.
Spring Boot çapraz etki alanı sorunları. Çapraz etki alanı sorunu belirtileri
CORS politikası tarafından engellendi: İstenen kaynakta 'Access-Control-Allow-Origin' üst bilgisi bulunmuyor.
Yukarıdaki mesaj, CORS protokolü tarafından engellenen bir kaynağa eriştiğinizi ve Header içinde Access-Control-Allow-Origin parametresinin bulunmadığını gösterir.
Çapraz etki alanı sorunu analizi
Çapraz etki alanı sorununun nedeni: Tarayıcı, güvenlik nedeniyle bu sitenin erişimine izin verdiği kaynaklara erişimi kısıtlar.
Örneğin, 127.0.0.1:8080/ adresinde bir web siteniz varsa ve üzerinde bir sayfa barındırılıyorsa, bu sayfada aynı sitenin kaynaklarına erişiminiz kısıtlanmaz. Ancak 127.0.0.1:8081 gibi başka sitelere ait kaynaklara erişim sınırlanır.
Not: Protokol, alan adı ve bağlantı noktası aynı olduğunda aynı site olarak kabul edilir.
Spring Boot çapraz etki alanı sorunları. Ancak src özniteliğine sahip img, script gibi etiketler bu kısıtlamaya tabi değildir.
Geçmişte, eski programlarda ön uç ve arka uç ayrılmamıştı; sayfa ve istek arayüzü aynı alan adı ve aynı bağlantı noktası altındaydı. Tüm tarayıcılar, aynı siteden gelen sayfanın aynı sitenin arayüzünü istemesine uzun süre izin vermiştir.
Spring Boot çapraz etki alanı sorunları. Örneğin, 127.0.0.1:8080/index.html sayfasından 127.0.0.1:8080/a/b/c/userList arayüzüne istek göndermek mümkündür.
Günümüzde ise ön uç ve arka uç ayrıştırılmıştır; sayfa ve arayüz genellikle aynı programda değildir, bu nedenle bu duruma izin verilmez ve bu istisna fırlatılır.
Spring Boot çapraz etki alanı sorunları. Kaynak (origin) ve çapraz etki alanı nedir?

Kaynak (origin); protokol, alan adı ve bağlantı noktası numarasından oluşur.
Bir URL; protokol, alan adı, bağlantı noktası ve yoldan oluşur. İki URL'nin protokolü, alan adı ve bağlantı noktası tamamen aynıysa aynı kaynaktadırlar. Aksi takdirde, protokolden, alan adından veya bağlantı noktasından herhangi biri farklıysa çapraz etki alanı söz konusudur.
https://www.baidu.com/index.html için çapraz etki alanı karşılaştırması:
Aynı Kaynak Politikası Nedir?
Aynı kaynak politikası bir sözleşmedir. Tarayıcının çekirdeğini ve en temel güvenlik işlevini oluşturur. Aynı kaynak politikası olmazsa tarayıcının normal işlevleri etkilenebilir. Web'in aynı kaynak politikası temelinde inşa edildiği söylenebilir; tarayıcı yalnızca bu politikanın bir uygulamasıdır.
Aynı kaynak politikası şu iki türe ayrılır:
1.DOM aynı kaynak politikası: Farklı kaynaklardaki sayfaların DOM'ları üzerinde işlem yapılması yasaktır. Buradaki ana senaryo iframe çapraz etki alanı durumudur; farklı alan adlarına sahip iframe'lerin birbirlerine erişimi kısıtlanır.
2.XMLHttpRequest Aynı Kaynak Politikası: XHR nesnelerini kullanarak farklı kaynaklardaki sunucu adreslerine HTTP isteği gönderilmesi yasaktır.
Spring Boot: Çapraz etki alanı sorunu çözümü
1. Spring Boot çapraz etki alanı sorunları. Çapraz etki alanını çözmek için filtre oluşturma
Projenin bileşenleri ayrı ayrı dağıtıldığından çapraz etki alanı sorunlarının çözülmesi gerekir. Kullanıcı oturum açma bilgilerini saklamak için çerezleri kullanıyoruz ve izinleri Spring kesicisinde kontrol ediyoruz. İzinler eşleşmediğinde kullanıcıya doğrudan sabit JSON sonucunu döndürüyoruz. Kullanıcı oturum açtığında sistem normal şekilde çalışır; kullanıcı oturumu kapattığında veya jeton süresi dolduğunda, kesici sırası ve çapraz etki alanı sorunundan dolayı çapraz etki alanı fenomeni ortaya çıkar. Bir HTTP isteğinin önce filtreye ulaştığını, ardından servlet'e geldikten sonra kesici tarafından işlendiğini biliyoruz. CORS'u filtreye yerleştirirsek, izin kesicisinden önce öncelikli olarak çalıştırılabilir.
@Configuration
public class CorsConfig {
@Bean
public CorsFilter corsFilter() {
CorsConfiguration corsConfiguration = new CorsConfiguration();
corsConfiguration.addAllowedOrigin("*");
corsConfiguration.addAllowedHeader("*");
corsConfiguration.addAllowedMethod("*");
corsConfiguration.setAllowCredentials(true);
UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);
return new CorsFilter(urlBasedCorsConfigurationSource);
}
}
2. WebMvcConfigurerAdapter yapılandırmasına dayalı olarak CORS ile çapraz etki alanı çözümü
Çapraz etki alanı ön uçta JSONP ile çözülebilir, ancak JSONP yalnızca GET istekleri gönderebilir ve diğer istek türlerini gönderemez. Bu durum RESTful tarzı uygulamalarda oldukça yetersizdir, bu nedenle çapraz etki alanı sorunlarını çözmek için arka uçta CORS (Cross-Origin Resource Sharing) kullanılmasını öneriyoruz. Bu çözüm Spring Boot'a özgü değildir. Geleneksel SSM çerçevesinde de CORS, çapraz etki alanı sorunlarını çözmek için kullanılabilirdi, ancak eskiden CORS'u XML dosyalarında yapılandırırdık. Artık WebMvcConfigurer arayüzünü uygulayıp addCorsMappings yöntemini yeniden yazarak çapraz etki alanı sorunlarını çözebiliriz.
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowCredentials(true)
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
.maxAge(3600);
}
}
3. Denetleyici için CORS yapılandırması
Denetleyici yöntemi için CORS yapılandırmasında, CORS'u etkinleştirmek amacıyla @RequestMapping ek açıklama işleyici yöntemine bir @CrossOrigin ek açıklaması ekleyebilirsiniz (varsayılan olarak @CrossOrigin, @RequestMapping ek açıklamasında belirtilen tüm kaynaklara ve HTTP yöntemlerine izin verir):
@RestController _
@RequestMapping ( " / account" )
public class AccountController {
@CrossOrigin _
@ GetMapping ( "/ {id}" )
public Account retrieve ( @ PathVariable) Long id )
// ...
A
@ DeleteMapping ( "/ {id}" )
public void remove ( @PathVariable _ Long id ) {
// ...
}
}
@CrossOrigin içindeki parametreler:
@CrossOrigin, tüm URL'lerin bu kaynağa erişebileceğini belirtir. @CrossOrigin ( origins = " http://127.0.0.1:8080")//Yalnızca bu URL'nin bu denetleyiciye çapraz etki alanı üzerinden erişmesine izin verildiğini belirtir. Kod açıklaması: @CrossOrigin ek açıklamasının kullanımı çok pratiktir; hem yöntemlerde hem de sınıflarda kullanılabilir. Value özniteliğini veya origins özniteliğini ayarlamazsanız, varsayılan olarak tüm URL/alan adı erişimine izin verilir.
1.Value özniteliği birden fazla URL ayarlayabilir.
2.Origins özelliği de birden fazla URL ayarlayabilir.
3.MaxAge özelliği, yanıt hazırlanmadan önce önbelleğin ne kadar süreyle geçerli olacağını belirtir. Bu, yoklama isteğinin geçerlilik süresidir.
4.AllowCredentials özelliği, kullanıcının çerez gönderip gönderemeyeceğini ve işleyip işleyemeyeceğini belirtir. Varsayılan değer false'tur.
5.AllowedHeaders özelliği hangi istek üst bilgilerinin izin verildiğini belirtir.
6.Methods özelliği istek için izin verilen yöntemleri belirtir; varsayılan olarak get, post, head'tir.
@CrossOrigin'in çalışmamasının nedenleri
1. @CrossOrigin'i desteklemek için springMVC sürümünün 4.2 veya üzeri olması gerekir.
2. @CrossOrigin olmayan durumlar çapraz etki alanı istek sorununu çözmemiştir, ancak hatalı bir istek beklenen yanıtın alınamamasına neden olarak tarayıcının çapraz etki alanı sorunu uyarısı vermesine yol açmıştır.
Controller ek açıklamasının üzerine @CrossOrigin ek açıklaması eklendiğinde bile çapraz etki alanı sorunu devam edebilir. Çözümlerden biri şudur:
@RequestMapping ek açıklamasında Get ve Post yöntemleri belirtilmemiştir. Bunlar belirtildikten sonra sorun çözülmüştür.
Benzer kod aşağıdaki gibidir:
@CrossOrigin _
@RestController _
public class person {
@RequestMapping ( method _ = RequestMethod.GET ) _ _
public String add ( ) {
// some code
}
}
İlgili Makaleler
-
Veri Depolama İçin 6 İsteğe Bağlı Teknoloji
Bilgi Bankası Ekibi
Daha Fazla Özel Teklifi Keşfedin
-
Kısa Mesaj Servisi (SMS) & Posta Hizmeti
50.000 e-posta paketi 1,99 USD'den başlayan fiyatlarla, 120 kısa mesaj ise yalnızca 1,00 USD'den başlayan fiyatlarla sunulur.
