Rumah  >  Artikel  >  Java  >  Bagaimana Springboot menyelesaikan masalah permintaan merentas domain pengepala tersuai ajax

Bagaimana Springboot menyelesaikan masalah permintaan merentas domain pengepala tersuai ajax

王林
王林ke hadapan
2023-05-16 12:43:061081semak imbas

1. Apakah itu merentas domain

Disebabkan dasar asal yang sama (dasar asal yang sama), ia adalah dasar keselamatan terkenal yang dicadangkan oleh Netscape Now semua penyemak imbas yang menyokong JavaScript Semua pelayan akan menggunakan strategi ini Apa yang dipanggil asal yang sama bermakna nama domain, protokol dan port adalah sama.) Jika mana-mana protokol, nama domain dan port yang digunakan untuk menghantar URL permintaan. adalah berbeza daripada alamat halaman semasa, ia dianggap merentas domain.

Untuk butiran, sila semak jadual berikut:

Bagaimana Springboot menyelesaikan masalah permintaan merentas domain pengepala tersuai ajax

2 Cara springboot menyelesaikan masalah merentas domain

1. Penyelesaian permintaan merentas domain biasa:

①Tambah anotasi @CrossOrigin(origins = "http://127.0.0.1:8020", maxAge = 3600) pada antara muka permintaan

Penerangan: origins = "http://127.0.0.1:8020" Nilai asal ialah domain yang sedang meminta antara muka

②Konfigurasi umum (semua antara muka membenarkan permintaan merentas domain)

Kelas konfigurasi Baharu atau tambahkan kaedah CorsFilter dan CorsConfiguration dalam Aplikasi

@Configuration 
public class CorsConfig { 
  private CorsConfiguration buildConfig() { 
    CorsConfiguration corsConfiguration = new CorsConfiguration(); 
    corsConfiguration.addAllowedOrigin("*"); // 1允许任何域名使用
    corsConfiguration.addAllowedHeader("*"); // 2允许任何头
    corsConfiguration.addAllowedMethod("*"); // 3允许任何方法(post、get等) 
    return corsConfiguration; 
  } 

  @Bean 
  public CorsFilter corsFilter() { 
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); 
    source.registerCorsConfiguration("/**", buildConfig()); // 4 
    return new CorsFilter(source); 
  } 
}

2 Permintaan silang domain bagi pengepala tersuai ajax

$.ajax({
    type:"GET",
    url:"http://localhost:8766/main/currency/sginInState",
    dataType:"JSON",
    data:{
      uid:userId
    },
    beforeSend: function (XMLHttpRequest) {
      XMLHttpRequest.setRequestHeader("Authorization", access_token);
    },
    success:function(res){
      console.log(res.code)
    }
  })

Permintaan. http pada masa ini: Antara muka //localhost:8766/main/currency/sginInState menemui OPTIONS http://localhost:8766/main/currency/sginInState 500 penyelesaian rentas domain biasa tidak dapat menyelesaikan masalah ini Permintaan OPTIONS muncul?

Bagaimana Springboot menyelesaikan masalah permintaan merentas domain pengepala tersuai ajax

Sebab

Pelayar akan menghantar permintaan prapenerbangan dengan PILIHAN kaedah sebelum menghantar permintaan prapenerbangan Ini Permintaan itu digunakan untuk mengesahkan sama ada permintaan ini selamat, tetapi tidak semua permintaan akan dihantar dan perlu memenuhi syarat berikut:

•Kaedah permintaan bukan GET/HEAD/POST
•Jenis-Kandungan Permintaan POST Bukan application/x-www-form-urlencoded, multipart/form-data, atau text/plain

•Permintaan menetapkan medan pengepala tersuai

Untuk antara muka pihak pengurusan, Saya mempunyai Antara muka melakukan pengesahan kebenaran Setiap permintaan perlu membawa medan tersuai (token) dalam pengepala, jadi penyemak imbas akan menghantar permintaan OPTIONS tambahan untuk mengesahkan keselamatan permintaan ini.

Mengapa OPTIONS meminta 500?

Permintaan OPTIONS hanya akan membawa medan tersuai dan tidak akan membawa nilai yang sepadan apabila medan token disahkan di latar belakang, token adalah NULL, jadi pengesahan gagal dan tidak normal. .

Jadi mari selesaikan masalah ini sekarang:

① Tambahkan

spring:
pada aplikasi projek but spring.yml mvc :
permintaan-pilihan-penghantaran: benar

Nota: Penyelesaian ini mungkin tidak menyelesaikan masalah OPTIONS dalam sesetengah kes Sebabnya mungkin isu alam sekitar atau isu konfigurasi penapis tersuai yang rumit, dsb.

②Tambah konfigurasi penapis

Langkah 1: Kelas konfigurasi penapis permintaan Penapis Permintaan Tulisan ini perlu melaksanakan kelas HandlerInterceptor, yang berada di bawah org.springframework.web.servlet.HandlerInterceptor.

Pelaksanaan kod khusus:

@Component
public class RequestFilter implements HandlerInterceptor {
  public boolean preHandler(HttpServletRequest request,HttpServletResponse response,Object handler){
    response.setHeader("Access-Control-Allow-Origin", "*");
    response.setHeader("Access-Control-Allow-Credentials", "true");
    response.setHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS");
    response.setHeader("Access-Control-Max-Age", "86400");
    response.setHeader("Access-Control-Allow-Headers", "Authorization");
    // 如果是OPTIONS请求则结束
    if (HttpMethod.OPTIONS.toString().equals(request.getMethod())) {
      response.setStatus(HttpStatus.NO_CONTENT.value());
      return false;
    }
    return true;
  }
}

Langkah 2: Tulisan Tangan MyWebConfiguration Kelas ini perlu mewarisi WebMvcConfigurationSupport.

Nota: WebMvcConfigurationSupport ialah versi 2.x atau lebih tinggi, dan versi 1.x ialah WebMvcConfigurerAdapter.

Pelaksanaan kod khusus:

@Component
public class MyWebConfiguration extends WebMvcConfigurationSupport{
  @Resource
  private RequestFilter requestFilter;
  @Override
  public void addInterceptors(InterceptorRegistry registry) {
    // 跨域拦截器
    registry.addInterceptor(requestFilter).addPathPatterns("/**");
  }
}

Atas ialah kandungan terperinci Bagaimana Springboot menyelesaikan masalah permintaan merentas domain pengepala tersuai ajax. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam