前端跨域请求问题

Spring Cloud Zuul的解决方案

package com.zhidianfan.pig.gateway.component.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;

@Configuration
public class CorsConfig {

    @Bean
    public CorsFilter corsFilter() {
        final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        final CorsConfiguration config = new CorsConfiguration();
        
        
        
        config.setAllowCredentials(true);
        config.addAllowedOrigin("*");
        config.addAllowedHeader("*");
        config.setMaxAge(18000L);
        config.addAllowedMethod("*");
        source.registerCorsConfiguration("/**", config);
        return new CorsFilter(source);
    }
}

image-20180928180930369

在Controller中配置

@CrossOrigin
@RestController
public class HandlerScanController {
	
	
	@CrossOrigin(allowCredentials="true", allowedHeaders="*", methods={RequestMethod.GET,
			RequestMethod.POST, RequestMethod.DELETE, RequestMethod.OPTIONS,
			RequestMethod.HEAD, RequestMethod.PUT, RequestMethod.PATCH}, origins="*")
	@PostMapping("/confirm")
	public Response handler(@RequestBody Request json){
		
		return null;
	}
}	

注意:如果我们使用Spring Cloud Zuul网关的同时,还使用了Spring Security,那么直接使用 CorsFilter 会冲突,可以使用

package com.zhidianfan.pig.gateway.component.config;

import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;

import java.util.Arrays;
import java.util.List;

@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class AjaxCorsFilter extends CorsFilter {
    public AjaxCorsFilter() {
        super(configurationSource());
    }

    private static UrlBasedCorsConfigurationSource configurationSource() {
        CorsConfiguration corsConfig = new CorsConfiguration();
//        List<String> allowedHeaders = Arrays.asList("x-auth-token", "content-type", "X-Requested-With", "XMLHttpRequest");
        List<String> exposedHeaders = Arrays.asList("x-auth-token", "content-type", "X-Requested-With", "XMLHttpRequest");
//        List<String> allowedMethods = Arrays.asList("POST", "GET", "DELETE", "PUT", "OPTIONS");


        List<String> allowedHeaders = Arrays.asList("*");
        List<String> allowedMethods = Arrays.asList("*");
        List<String> allowedOrigins = Arrays.asList("*");
        corsConfig.setAllowedHeaders(allowedHeaders);
        corsConfig.setAllowedMethods(allowedMethods);
        corsConfig.setAllowedOrigins(allowedOrigins);
        corsConfig.setExposedHeaders(exposedHeaders);
        corsConfig.setMaxAge(36000L);
        corsConfig.setAllowCredentials(true);

        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", corsConfig);
        return source;
    }
}

如果在网关中已经对跨域请求做了处理,就不要在网关内部的各个微服务中再做处理,否则也会有异常

猜你喜欢

转载自blog.csdn.net/m0_37208669/article/details/84799471