Rumah  >  Artikel  >  Java  >  Cara Springboot mengendalikan isu merentas domain akses bukan asal Cors dengan mengkonfigurasi WebMvcConfig

Cara Springboot mengendalikan isu merentas domain akses bukan asal Cors dengan mengkonfigurasi WebMvcConfig

WBOY
WBOYke hadapan
2023-05-10 14:55:19895semak imbas

Mengenai masalah merentas domain Cors, bahagian hadapan mempunyai proksi dan jsonp sebagai cara biasa untuk menyelesaikan dasar penafian akses bukan asal ini. Apakah asal yang sama? Iaitu, dua atau lebih jenis akses bersama dengan nama domain yang sama dan port yang sama tetapi API antara muka berbeza yang diakses di bawah port dipanggil akses asal yang sama Walau bagaimanapun, jika antara muka tidak konsisten atau nama domain tidak konsisten (di sini secara amnya merujuk kepada IP yang tidak konsisten), maka yang sepadan adalah akses bukan asal yang sama Apabila mengakses, penyemak imbas akan menolak untuk menghantar permintaan dan terus membalas 404. Kadang-kadang saya juga melihat bahawa pemulihan 202 dihantar tetapi ditolak oleh belakang. -Tamat rantai pengendali pemprosesan Mvc. Kemudian mengkonfigurasi MVC ialah penyelesaian kepada masalah Cors bahagian belakang.

Saya telah mempelajari pautan pemprosesan MVC sebelum ini Dari masa permintaan dihantar ke data balasan, terdapat sebanyak 11 kali pemprosesan:

Cara Springboot mengendalikan isu merentas domain akses bukan asal Cors dengan mengkonfigurasi WebMvcConfig

Apabila permintaan dihantar ke pelayan, ia diproses oleh MVC kami, dan penghantar permintaan kami yang memperuntukkan proses tugasan secara seragam Ambil perhatian bahawa selepas permintaan sampai ke pemproses, ia kembali untuk mencari penyesuai pemproses (permintaan yang memenuhi pemprosesan pengesahan boleh dibenarkan, seperti api undang-undang yang terkandung dalam antara muka) , dan prinsip merentas domain), kami tidak mempertimbangkan isu merentas domain semasa proses pembangunan applet WeChat kami bahawa kita tahu bahawa pemprosesan permintaan applet diedarkan dan diproses oleh latar belakang WeChat, iaitu, apabila latar belakang WeChat saya melakukan pemprosesan merentas domain di bahagian hadapan, mungkin menggunakan proksi dinamik untuk menyelesaikan masalah merentas domain kecil program.

Kemudian mari kita lihat dahulu kod sumber antara muka konfigurasi MVC WebMvcConfigurer:

public interface WebMvcConfigurer {
    default void configurePathMatch(PathMatchConfigurer configurer) {
    }
    default void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
    }
    default void configureAsyncSupport(AsyncSupportConfigurer configurer) {
    }
    default void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
    }
    default void addFormatters(FormatterRegistry registry) {
    }
    default void addInterceptors(InterceptorRegistry registry) {
    }
    default void addResourceHandlers(ResourceHandlerRegistry registry) {
    }
    default void addCorsMappings(CorsRegistry registry) {
    }
    default void addViewControllers(ViewControllerRegistry registry) {
    }
    default void configureViewResolvers(ViewResolverRegistry registry) {
    }
    default void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
    }
    default void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> handlers) {
    }
    default void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    }
    default void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
    }
    default void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
    }
    default void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
    }
    @Nullable
    default Validator getValidator() {
        return null;
    }
    @Nullable
    default MessageCodesResolver getMessageCodesResolver() {
        return null;
    }
}

Ia mempunyai beberapa penghurai pemproses dan penambahan pemetaan dan kaedah konfigurasi secara dalaman, jadi kita perlu Untuk menyelesaikan salib -masalah domain Cros, kami perlu mempertimbangkan addCorsMappings untuk mengkonfigurasi pemetaan Cros, jadi kami klik masuk untuk melihat kod sumber CorsRegistry yang mendaftarkan Cros:

public class CorsRegistry {
    private final List<CorsRegistration> registrations = new ArrayList();
    public CorsRegistry() {
    }
    public CorsRegistration addMapping(String pathPattern) {
        CorsRegistration registration = new CorsRegistration(pathPattern);
        this.registrations.add(registration);
        return registration;
    }
    protected Map<String, CorsConfiguration> getCorsConfigurations() {
        Map<String, CorsConfiguration> configs = CollectionUtils.newLinkedHashMap(this.registrations.size());
        Iterator var2 = this.registrations.iterator();
        while(var2.hasNext()) {
            CorsRegistration registration = (CorsRegistration)var2.next();
            configs.put(registration.getPathPattern(), registration.getCorsConfiguration());
        }
        return configs;
    }
}

Tidak sukar untuk mencari daripada kod di atas yang terdapat tatasusunan CorsRegistration yang tidak berubah secara dalaman, serta kaedah menambah pemetaan, perkara utama ialah melihat item konfigurasi yang terkandung dalam CorsRegistration:

public class CorsRegistration {
    private final String pathPattern;
    private CorsConfiguration config;
    public CorsRegistration(String pathPattern) {
        this.pathPattern = pathPattern;
        this.config = (new CorsConfiguration()).applyPermitDefaultValues();
    }
    public CorsRegistration allowedOrigins(String... origins) {
        this.config.setAllowedOrigins(Arrays.asList(origins));
        return this;
    }
    public CorsRegistration allowedOriginPatterns(String... patterns) {
        this.config.setAllowedOriginPatterns(Arrays.asList(patterns));
        return this;
    }
    public CorsRegistration allowedMethods(String... methods) {
        this.config.setAllowedMethods(Arrays.asList(methods));
        return this;
    }
    public CorsRegistration allowedHeaders(String... headers) {
        this.config.setAllowedHeaders(Arrays.asList(headers));
        return this;
    }
    public CorsRegistration exposedHeaders(String... headers) {
        this.config.setExposedHeaders(Arrays.asList(headers));
        return this;
    }
    public CorsRegistration allowCredentials(boolean allowCredentials) {
        this.config.setAllowCredentials(allowCredentials);
        return this;
    }
    public CorsRegistration maxAge(long maxAge) {
        this.config.setMaxAge(maxAge);
        return this;
    }
    public CorsRegistration combine(CorsConfiguration other) {
        this.config = this.config.combine(other);
        return this;
    }
    protected String getPathPattern() {
        return this.pathPattern;
    }
    protected CorsConfiguration getCorsConfiguration() {
        return this.config;
    }
}

Kami dapati ia mempunyai kebenaran dalaman. keluaran: pengepala permintaan, laluan permintaan, kaedah permintaan, kaedah dasar sumber permintaan, jadi kami menulis semula kaedah addCorsMappings di sini untuk mengkonfigurasi CorsRegistry Bolehkah menambah kaedah laluan yang sepadan dan mengeluarkan dasar permintaan menyelesaikan masalah merentas domain?

Kami menulis kelas konfigurasi WebMvcConfig untuk melaksanakan antara muka WebMvcConfigurer yang baru kami pelajari dan menulis semula addCrosMappings untuk mengkonfigurasi CrosRegistry (atau menambah anotasi @CrossOrigin pada api dan kelas kawalan Pengawal juga boleh menyelesaikan masalah (anotasi mengeluarkan permintaan daripada semua sumber secara lalai) )):

/**
 * 配置前端跨域访问请求
 */
@Configuration
public class WbMvcConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
       registry.addMapping("/**")
               .allowedHeaders("Content-Type","X-Request-With","Access-Control-Request-Method","Access-Control-Request-Headers","token")
               .allowedMethods("*")
               .allowedOriginPatterns("*")
               /*注意当这个配置为真是我们不能将允许源设置为*而是将源路径设置为*即可*/
               .allowCredentials(true);
    }
    @Bean
    public FormContentFilter httpPutFormContentFilter(){
        return new FormContentFilter();
    }
}

Kami menggunakan axios untuk menulis butang hantar permintaan ringkas:

    <input type="button" value="get" class="get">
    <script>
        document.querySelector(".get").onclick = function () {
            // 跨域一般是是后端解决的事情
            axios.get("http://127.0.0.1:8080/all").then(
                function (response) {
                    console.log(response)
                }
            )
        }
    </script>

Kemudian gunakan SpringBoot untuk menulis api pengawal mudah:

@RestController
public class testController {
    @Autowired
    private ProductServiceImpl productService;
    @GetMapping("/all")
    @ResponseBody
    public List<Product> all() {
        Page<Product> page = productService.page(1L);
        List<Product> productList = new LinkedList<>();
        productList.add(page.getRecords().iterator().next());
        return productList;
    }
}

Di sini kami menyemak imbas Buka fail html ini di bawah port 5050 dan klik butang untuk mengakses antara muka:

Cara Springboot mengendalikan isu merentas domain akses bukan asal Cors dengan mengkonfigurasi WebMvcConfig

Di sini anda boleh melihat bahawa permintaan untuk mengakses data telah berjaya!

Atas ialah kandungan terperinci Cara Springboot mengendalikan isu merentas domain akses bukan asal Cors dengan mengkonfigurasi WebMvcConfig. 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