Rumah > Java > javaTutorial > Apakah cara Spring Boot melaksanakan merentas domain

Apakah cara Spring Boot melaksanakan merentas domain

WBOY
Lepaskan: 2023-05-18 10:10:26
ke hadapan
1392 orang telah melayarinya

1. Mengapa masalah merentas domain berlaku

Disebabkan oleh sekatan dasar yang sama asal penyemak imbas. Dasar asal yang sama (Dasar asal yang sama) ialah konvensyen Ia adalah teras dan fungsi keselamatan paling asas penyemak imbas Jika dasar asal yang sama tiada, fungsi normal penyemak imbas mungkin terjejas. Web dibina berdasarkan dasar asal yang sama dan penyemak imbas hanyalah satu cara untuk melaksanakan dasar asal yang sama.

Dalam JavaScript, dasar asal yang sama akan mengehadkan interaksi antara domain berbeza dan menghalang serangan merentas domain. Asal yang dipanggil sama (iaitu, dalam domain yang sama) bermakna kedua-dua halaman mempunyai protokol, hos dan nombor port yang sama

2. Apakah domain silang

Apabila ada salah satu protokol, nama domain dan port URL permintaan adalah berbeza daripada URL halaman semasa, ia adalah merentas domain

Apakah cara Spring Boot melaksanakan merentas domain

3 >

  1. Tidak dapat membaca Cookie, LocalStorage dan IndexedDB halaman web bukan homolog

  2. Tidak dapat mengakses DOM halaman web bukan homolog

  3. Tidak dapat menghantar permintaan AJAX ke alamat bukan asal

4 Bagaimana bahagian belakang java melaksanakan permintaan merentas domain CORS

Untuk silang CORS. -permintaan domain, Terdapat terutamanya kaedah berikut untuk dipilih:

  1. Kembalikan CorsFilter baharu

  2. Tulis Semula WebMvcConfigurer

  3. Gunakan anotasi @CrossOrigin

  4. Tetapkan pengepala respons (HttpServletResponse) secara manual

  5. Penapis web tersuai untuk mencapai merentas domain

Nota:

  • CorFilter / WebMvConfigurer / @CrossOrigin memerlukan SpringMVC versi 4.2 ke atas untuk menyokong, sepadan dengan springBoot versi 1.3 ke atas

  • Dua kaedah pertama ialah konfigurasi CORS global, manakala dua kaedah terakhir ialah konfigurasi CORS tempatan. Jika domain silang setempat digunakan, ia akan mengatasi peraturan merentas domain global, jadi anotasi @CrossOrigin boleh digunakan untuk kawalan sumber merentas domain yang lebih halus.

  • Malah, tidak kira penyelesaian yang mana, matlamat utama adalah untuk mengubah suai pengepala respons, menambah data yang diperlukan oleh penyemak imbas pada pengepala respons, dan kemudian mencapai merentas domain

1 Kembalikan CorsFilter baharu (domain silang global)

Dalam mana-mana kelas konfigurasi, kembalikan CorsFIlter Bean baharu dan tambahkan laluan pemetaan dan laluan konfigurasi CORS tertentu.

@Configuration
public class GlobalCorsConfig {
    @Bean
    public CorsFilter corsFilter() {
        //1. 添加 CORS配置信息
        CorsConfiguration config = new CorsConfiguration();
        //放行哪些原始域
        config.addAllowedOrigin("*");
        //是否发送 Cookie
        config.setAllowCredentials(true);
        //放行哪些请求方式
        config.addAllowedMethod("*");
        //放行哪些原始请求头部信息
        config.addAllowedHeader("*");
        //暴露哪些头部信息
        config.addExposedHeader("*");
        //2. 添加映射路径
        UrlBasedCorsConfigurationSource corsConfigurationSource = new UrlBasedCorsConfigurationSource();
        corsConfigurationSource.registerCorsConfiguration("/**",config);
        //3. 返回新的CorsFilter
        return new CorsFilter(corsConfigurationSource);
    }
}
Salin selepas log masuk

2. Tulis Semula WebMvcConfigurer (rentas domain global)

@Configuration
public class CorsConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                //是否发送Cookie
                .allowCredentials(true)
                //放行哪些原始域
                .allowedOrigins("*")
                .allowedMethods(new String[]{"GET", "POST", "PUT", "DELETE"})
                .allowedHeaders("*")
                .exposedHeaders("*");
    }
}
Salin selepas log masuk

3 Gunakan anotasi (rentas domain tempatan)

Gunakan anotasi @ pada pengawal (pada kelas. ) CrossOrigin:, menunjukkan bahawa semua kaedah kelas ini membenarkan merentas domain.

@RestController
@CrossOrigin(origins = "*")
public class HelloController {
    @RequestMapping("/hello")
    public String hello() {
        return "hello world";
    }
}
Salin selepas log masuk

Gunakan anotasi @CrossOrigin pada kaedah:

@RequestMapping("/hello")
    @CrossOrigin(origins = "*")
     //@CrossOrigin(value = "http://localhost:8081") //指定具体ip允许跨域
    public String hello() {
        return "hello world";
    }
Salin selepas log masuk

4 Tetapkan pengepala respons (domain silang separa) secara manual

Gunakan objek HttpServletResponse untuk menambah respons. header (Access-Control- Allow-Origin) untuk membenarkan domain asal Nilai Origin di sini juga boleh ditetapkan kepada "*", menunjukkan bahawa semua kebenaran dibenarkan.

@RequestMapping("/index")
public String index(HttpServletResponse response) {
    response.addHeader("Access-Allow-Control-Origin","*");
    return "index";
}
Salin selepas log masuk

5. Gunakan penapis tersuai untuk mencapai merentas domain

Mula-mula tulis penapis, yang boleh dinamakan MyCorsFilter.java

package com.mesnac.aop;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
@Component
public class MyCorsFilter implements Filter {
  public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
    HttpServletResponse response = (HttpServletResponse) res;
    response.setHeader("Access-Control-Allow-Origin", "*");
    response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
    response.setHeader("Access-Control-Max-Age", "3600");
    response.setHeader("Access-Control-Allow-Headers", "x-requested-with,content-type");
    chain.doFilter(req, res);
  }
  public void init(FilterConfig filterConfig) {}
  public void destroy() {}
}
Salin selepas log masuk

Konfigurasikan penapis ini dalam peranti web.xml untuk menjadikannya berkesan

<!-- 跨域访问 START-->
<filter>
 <filter-name>CorsFilter</filter-name>
 <filter-class>com.mesnac.aop.MyCorsFilter</filter-class>
</filter>
<filter-mapping>
 <filter-name>CorsFilter</filter-name>
 <url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 跨域访问 END  -->
Salin selepas log masuk

Atas ialah kandungan terperinci Apakah cara Spring Boot melaksanakan merentas domain. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:yisu.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan