# 服务器跨域处理

跨域处理

跨域是什么？浏览器从一个域名的网页去请求另一个域名的资源时，域名、端口、 协议任一不同，都是跨域 。我们是采用前后端分离开发的，也是前后端分离部署的，必然会存在跨域问题。 怎么解决跨域？很简单，只需要在controller类上添加注解 @CrossOrigin 即可！这个注解其实是CORS的实现。

CORS(Cross-Origin Resource Sharing, 跨源资源共享)是W3C出的一个标准，其思 想是使用自定义的HTTP头部让浏览器与服务器进行沟通，从而决定请求或响应是应该成 功，还是应该失败。因此，要想实现CORS进行跨域，需要服务器进行一些设置，同时前端也需要做一些配置和分析。本文简单的对服务端的配置和前端的一些设置进行分析。

1️⃣在controller类上添加注解 @CrossOrigin，表示Controller上的所以方法允许跨域，在方法上添加注解 @CrossOrigin，表示该方法允许跨域

@Target({ ElementType.METHOD, ElementType.TYPE })

@Retention(RetentionPolicy.RUNTIME)

@Documented

public @interface CrossOrigin {

String[] DEFAULT_ORIGINS = { "*" };

String[] DEFAULT_ALLOWED_HEADERS = { "*" };

boolean DEFAULT_ALLOW_CREDENTIALS = true;

long DEFAULT_MAX_AGE = 1800;

/**

* 同origins属性一样

*/

@AliasFor("origins")

String[] value() default {};

/**

* 所有支持域的集合，例如"http://domain1.com"。

* <p>这些值都显示在请求头中的Access-Control-Allow-Origin

* "*"代表所有域的请求都支持

* <p>如果没有定义，所有请求的域都支持

* @see #value

*/

@AliasFor("value")

String[] origins() default {};

/**

* 允许请求头中的header，默认都支持

*/

String[] allowedHeaders() default {};

/**

* 响应头中允许访问的header，默认为空

*/

String[] exposedHeaders() default {};

/**

* 请求支持的方法，例如"{RequestMethod.GET, RequestMethod.POST}"}。

* 默认支持RequestMapping中设置的方法

*/

RequestMethod[] methods() default {};

/**

* 是否允许cookie随请求发送，使用时必须指定具体的域

*/

String allowCredentials() default "";

/**

* 预请求的结果的有效期，默认30分钟

*/

long maxAge() default -1;

}

2️⃣配置 CorsFilter(全局配置)

@Configuration

public class GlobalCorsConfig {

@Bean

public CorsFilter corsFilter() {

//1.添加CORS配置信息

CorsConfiguration config = new CorsConfiguration();

//1) 允许的域,不要写*，否则cookie就无法使用了

config.addAllowedOrigin("http://manage.shop.com");

config.addAllowedOrigin("http://www.shop.com");

//2) 是否发送Cookie信息

config.setAllowCredentials(true);

//3) 允许的请求方式

config.addAllowedMethod("OPTIONS");

config.addAllowedMethod("HEAD");

config.addAllowedMethod("GET");

config.addAllowedMethod("PUT");

config.addAllowedMethod("POST");

config.addAllowedMethod("DELETE");

config.addAllowedMethod("PATCH");

// 4）允许的头信息

config.addAllowedHeader("*");

// 5) 有效时长

// config.setMaxAge(3600L);

//2.添加映射路径，我们拦截一切请求

UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();

configSource.registerCorsConfiguration("/**", config);

//3.返回新的CorsFilter.

return new CorsFilter(configSource);

}

}