Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
SpringBoot ʵÏÖǰºó¶Ë·ÖÀëµÄ¿çÓò·ÃÎÊ£¨CORS£©
 
  18144  次浏览      28
 2017-11-23  
 
±à¼­ÍƼö:
±¾ÎÄÀ´Ô´¼òÊ飬½éÉÜÁËÒ»ÖÖÖ»ÐèÔÚ·þÎñ¶Ë½øÐÐÊÚȨ¼´¿É£¬ÎÞÐèÔÚǰ¶ËÌí¼Ó¶îÍâÉèÖ㬱ȴ«Í³µÄJSONP¿çÓò¸ü°²È«ºÍ±ã½ÝµÄ·½Ê½CORS¡£

Ò»¡¢»ù±¾½éÉÜ

¼òµ¥À´Ëµ£¬CORSÊÇÒ»ÖÖ·ÃÎÊ»úÖÆ£¬Ó¢ÎÄÈ«³ÆÊÇCross-Origin Resource Sharing£¬¼´ÎÒÃdz£ËµµÄ¿çÓò×ÊÔ´¹²Ïí£¬Í¨¹ýÔÚ·þÎñÆ÷¶ËÉèÖÃÏìӦͷ£¬°Ñ·¢Æð¿çÓòµÄԭʼÓòÃûÌí¼Óµ½Access-Control-Allow-Origin ¼´¿É¡£

1. CORS¹¤×÷Ô­Àí

CORSʵÏÖ¿çÓò·ÃÎʲ¢²»ÊÇÒ»õí¶ø¾ÍµÄ£¬ÐèÒª½èÖúä¯ÀÀÆ÷µÄÖ§³Ö£¬´ÓÔ­ÀíÌâͼÎÒÃÇ¿ÉÒÔÇå³þ¿´µ½£¬¼òµ¥µÄÇëÇó£¨Í¨³£Ö¸GET/POST/HEAD·½Ê½£¬²¢Ã»ÓÐÈ¥Ôö¼Ó¶îÍâµÄÇëÇóÍ·ÐÅÏ¢£©Ö±½Ó´´½¨ÁË¿çÓòÇëÇóµÄXHR¶ÔÏ󣬶ø¸´ÔÓµÄÇëÇóÔòÒªÇóÏÈ·¢ËÍÒ»¸ö¡±Ô¤¼ì¡±ÇëÇ󣬴ý·þÎñÆ÷Åú×¼ºó²ÅÄÜÕæÕý·¢Æð¿çÓò·ÃÎÊÇëÇó¡£

¸ù¾Ý¹Ù·½Îĵµ W3C¹æ·¶-CORS µÄÃèÊö£¬Ä¿Ç°CORSʹÓÃÁËÈçÏÂÍ·²¿ÐÅÏ¢£º

×¢£ºÇëÇóÍ·ÐÅÏ¢ÓÉä¯ÀÀÆ÷¼ì²âµ½¿çÓò×Ô¶¯Ìí¼Ó£¬ÎÞÐè¹ý¶à¸ÉÔ¤£¬Öصã·ÅÔÚResponse headers£¬Ëü¿ÉÒÔ°ïÖúÎÒÃÇÔÚ·þÎñÆ÷½øÐпçÓòÊÚȨ£¬ÀýÈçÔÊÐíÄÄЩԭʼÓò¿É·ÅÐУ¬ÊÇ·ñÐèҪЯ´øCookieÐÅÏ¢µÈ¡£

2. Request Headers£¨ÇëÇóÍ·£©

  • Origin
  • ±íʾ¿çÓòÇëÇóµÄԭʼÓò¡£
  • Access-Control-Request-Method
  • ±íʾ¿çÓòÇëÇóµÄ·½Ê½¡££¨ÈçGET/POST£©
  • Access-Control-Request-Headers
  • ±íʾ¿çÓòÇëÇóµÄÇëÇóÍ·ÐÅÏ¢¡£

3. Response headers£¨ÏìӦͷ £©

  • Access-Control-Allow-Origin
  • ±íʾÔÊÐíÄÄЩԭʼÓò½øÐпçÓò·ÃÎÊ¡££¨×Ö·ûÊý×飩
  • Access-Control-Allow-Credentials
  • ±íʾÊÇ·ñÔÊÐí¿Í»§¶Ë»ñÈ¡Óû§Æ¾¾Ý¡££¨²¼¶ûÀàÐÍ£©
    ʹÓó¡¾°£ºÀýÈçÏÖÔÚ´Óä¯ÀÀÆ÷·¢Æð¿çÓòÇëÇ󣬲¢ÇÒÒª¸½´øCookieÐÅÏ¢¸ø·þÎñÆ÷¡£Ôò±ØÐë¾ß±¸Á½¸öÌõ¼þ£º1. ä¯ÀÀÆ÷¶Ë£º·¢ËÍAJAXÇëÇóǰÐèÉèÖÃͨÐŶÔÏóXHRµÄwithCredentials ÊôÐÔΪtrue¡£ 2.·þÎñÆ÷¶Ë£ºÉèÖÃAccess-Control-Allow-CredentialsΪtrue¡£Á½¸öÌõ¼þȱһ²»¿É£¬·ñÔò¼´Ê¹·þÎñÆ÷ͬÒâ·¢ËÍCookie£¬ä¯ÀÀÆ÷Ò²ÎÞ·¨»ñÈ¡¡£ÕýÈ·×ËÊÆÈçÏ£º

  • Access-Control-Allow-Methods
  • ±íʾ¿çÓòÇëÇóµÄ·½Ê½µÄÔÊÐí·¶Î§¡££¨ÀýÈçÖ»ÊÚȨGET/POST£©
  • Access-Control-Allow-Headers
  • ±íʾ¿çÓòÇëÇóµÄÍ·²¿µÄÔÊÐí·¶Î§¡£
  • Access-Control-Expose-Headers
  • ±íʾ±©Â¶ÄÄЩͷ²¿ÐÅÏ¢£¬²¢Ìṩ¸ø¿Í»§¶Ë¡££¨ÒòΪ»ùÓÚ°²È«¿¼ÂÇ£¬Èç¹ûûÓÐÉèÖöîÍâµÄ±©Â¶£¬¿çÓòµÄͨÐŶÔÏóXMLHttpRequestÖ»ÄÜ»ñÈ¡±ê×¼µÄÍ·²¿ÐÅÏ¢£©
  • Access-Control-Max-Age
  • ±íʾԤ¼ìÇëÇó [Preflight Request] µÄ×î´ó»º´æÊ±¼ä¡£

¶þ¡¢CORSʵÏÖ¿çÓò·ÃÎÊ

ÊÚȨ·½Ê½

  • ·½Ê½1£º·µ»ØÐµÄCorsFilter
  • ·½Ê½2£ºÖØÐ´WebMvcConfigurer
  • ·½Ê½3£ºÊ¹ÓÃ×¢½â£¨@CrossOrigin£©
  • ·½Ê½4£ºÊÖ¹¤ÉèÖÃÏìӦͷ£¨HttpServletResponse £©

×¢£ºCorsFilter / WebMvcConfigurer / @CrossOrigin ÐèÒªSpringMVC 4.2 ÒÔÉϵİ汾²ÅÖ§³Ö£¬¶ÔÓ¦SpringBoot 1.3 °æ±¾ÒÔÉ϶¼Ö§³ÖÕâЩCORSÌØÐÔ¡£²»¹ý£¬Ê¹ÓÃSpringMVC4.2 ÒÔϰ汾µÄС»ï°éÒ²²»Óûţ¬Ö±½ÓʹÓ÷½Ê½4ͨ¹ýÊÖ¹¤Ìí¼ÓÏìӦͷÀ´ÊÚȨCORS¿çÓò·ÃÎÊÒ²ÊÇ¿ÉÒԵġ£¸½£ºÔÚSpringBoot 1.2.8 + SpringMVC 4.1.9 Çײâ³É¹¦¡£

×¢£º·½Ê½1ºÍ·½Ê½2ÊôÓÚÈ«¾ÖCORSÅäÖ㬷½Ê½3ºÍ·½Ê½4ÊôÓÚ¾Ö²¿CORSÅäÖá£Èç¹ûʹÓÃÁ˾ֲ¿¿çÓòÊǻḲ¸ÇÈ«¾Ö¿çÓòµÄ¹æÔò£¬ËùÒÔ¿ÉÒÔͨ¹ý@CrossOrigin×¢½âÀ´½øÐÐϸÁ£¶È¸ü¸ßµÄ¿çÓò×ÊÔ´¿ØÖÆ¡£

1. ·µ»ØÐµÄCorsFilter£¨È«¾Ö¿çÓò£©

ÔÚÈÎÒâÅäÖÃÀ࣬·µ»ØÒ»¸öеÄCorsFilter Bean£¬²¢Ìí¼ÓÓ³Éä·¾¶ºÍ¾ßÌåµÄCORSÅäÖÃÐÅÏ¢¡£

package com.hehe.yyweb.config;
@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 configSource = new UrlBasedCorsConfigurationSource();
configSource.registerCorsConfiguration("/**", config);
//3.·µ»ØÐµÄCorsFilter.
return new CorsFilter(configSource);
}
}

2. ÖØÐ´WebMvcConfigurer£¨È«¾Ö¿çÓò£©

ÔÚÈÎÒâÅäÖÃÀ࣬·µ»ØÒ»¸öеÄWebMvcConfigurer Bean£¬²¢ÖØÐ´ÆäÌṩµÄ¿çÓòÇëÇó´¦ÀíµÄ½Ó¿Ú£¬Ä¿µÄÊÇÌí¼ÓÓ³Éä·¾¶ºÍ¾ßÌåµÄCORSÅäÖÃÐÅÏ¢¡£

package com.hehe.yyweb.config;
@Configuration
public class GlobalCorsConfig {
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
//ÖØÐ´¸¸ÀàÌṩµÄ¿çÓòÇëÇó´¦ÀíµÄ½Ó¿Ú
public void addCorsMappings(CorsRegistry registry) {
//Ìí¼ÓÓ³Éä·¾¶
registry.addMapping("/**")
//·ÅÐÐÄÄЩԭʼÓò
.allowedOrigins("*")
//ÊÇ·ñ·¢ËÍCookieÐÅÏ¢
.allowCredentials(true)
//·ÅÐÐÄÄЩԭʼÓò(ÇëÇó·½Ê½)
.allowedMethods("GET","POST", "PUT", "DELETE")
//·ÅÐÐÄÄЩԭʼÓò(Í·²¿ÐÅÏ¢)
.allowedHeaders("*")
//±©Â¶ÄÄЩͷ²¿ÐÅÏ¢£¨ÒòΪ¿çÓò·ÃÎÊĬÈϲ»ÄÜ»ñȡȫ²¿Í·²¿ÐÅÏ¢£©
.exposedHeaders("Header1", "Header2");
}
};
}
}

3. ʹÓÃ×¢½â£¨¾Ö²¿¿çÓò£©

ÔÚ·½·¨ÉÏ£¨@RequestMapping£©Ê¹ÓÃ×¢½â @CrossOrigin £º

@RequestMapping("/hello")
@ResponseBody
@CrossOrigin("http://localhost:8080")
public String index( ){
return "Hello World";
}

»òÕßÔÚ¿ØÖÆÆ÷£¨@Controller£©ÉÏʹÓÃ×¢½â @CrossOrigin £º

@Controller
@CrossOrigin(origins = "http://xx-domain.com", maxAge = 3600)
public class AccountController {
@RequestMapping("/hello")
@ResponseBody
public String index( ){
return "Hello World";
}
}

4. ÊÖ¹¤ÉèÖÃÏìӦͷ£¨¾Ö²¿¿çÓò £©

ʹÓÃHttpServletResponse¶ÔÏóÌí¼ÓÏìӦͷ£¨Access-Control-Allow-Origin£©À´ÊÚȨԭʼÓò£¬ÕâÀïOriginµÄÖµÒ²¿ÉÒÔÉèÖÃΪ¡±*¡± £¬±íʾȫ²¿·ÅÐС£

@RequestMapping("/hello")
@ResponseBody
public String index(HttpServletResponse response){
response.addHeader("Access-Control-Allow-Origin", "http://localhost:8080");
return "Hello World";
}

Èý¡¢²âÊÔ¿çÓò·ÃÎÊ

Ê×ÏÈʹÓà Spring Initializr ¿ìËÙ¹¹½¨Ò»¸öMaven¹¤³Ì£¬Ê²Ã´¶¼²»Óøģ¬ÔÚstaticĿ¼Ï£¬Ìí¼ÓÒ»¸öÒ³Ãæ£ºindex.html À´Ä£Äâ¿çÓò·ÃÎÊ¡£Ä¿±êµØÖ·: http://localhost:8090/hello

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"/>
<title>Page Index</title>
</head>
<body>
<h2>ǰ̨ϵͳ</h2>
<p id="info"></p>
</body>
<script src="webjars/jquery/3.2.1/jquery.js"></script>
<script>
$.ajax({
url: 'http://localhost:8090/hello',
type: "POST",
success: function (data) {
$("#info").html("¿çÓò·ÃÎʳɹ¦:"+data);
},
error: function (data) {
$("#info").html("¿çÓòʧ°Ü!!");
}
})
</script>
</html>

È»ºó´´½¨ÁíÒ»¸ö¹¤³Ì£¬ÔÚRoot PackageÌí¼ÓConfigĿ¼²¢´´½¨ÅäÖÃÀàÀ´¿ªÆôÈ«¾ÖCORS¡£

package com.hehe.yyweb.config;
@Configuration
public class GlobalCorsConfig {
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**");
}
};
}
}

½Ó×Å£¬¼òµ¥±àдһ¸öRest½Ó¿Ú £¬²¢Ö¸¶¨Ó¦Óö˿ÚΪ8090¡£

package com.hehe.yyweb;
@SpringBootApplication
@RestController
public class YyWebApplication {
@Bean
public TomcatServletWebServerFactory tomcat() {
TomcatServletWebServerFactory tomcatFactory = new TomcatServletWebServerFactory();
tomcatFactory.setPort(8090); //ĬÈÏÆô¶¯8090¶Ë¿Ú
return tomcatFactory;
}
@RequestMapping("/hello")
public String index() {
return "Hello World";
}
public static void main(String[] args) {
SpringApplication.run(YyWebApplication.class, args);
}
}

×îºó·Ö±ðÆô¶¯Á½¸öÓ¦Óã¬È»ºóÔÚä¯ÀÀÆ÷·ÃÎÊ£ºhttp://localhost:8080/index.html £¬¿ÉÒÔÕý³£½ÓÊÕJSONÊý¾Ý£¬ËµÃ÷¿çÓò·ÃÎʳɹ¦£¡£¡

³¢ÊÔ°ÑÈ«¾ÖCORS¹Ø±Õ£¬»òÕßûÓе¥¶ÀÔÚ·½·¨»òÀàÉÏÊÚȨ¿çÓò£¬ÔٴηÃÎÊ£ºhttp://localhost:8080/index.html ʱ»á¿´µ½¿çÓòÇëÇóʧ°Ü£¡£¡

ËÄ¡¢Ô´ÂëºÍÎĵµ

Ô´ÂëµØÖ·£ºSpringBoot-Cross-Orgin

   
18144 ´Îä¯ÀÀ       28
Ïà¹ØÎÄÕÂ

Java΢·þÎñÐÂÉú´úÖ®Nacos
ÉîÈëÀí½âJavaÖеÄÈÝÆ÷
JavaÈÝÆ÷Ïê½â
Java´úÂëÖÊÁ¿¼ì²é¹¤¾ß¼°Ê¹Óð¸Àý
Ïà¹ØÎĵµ

JavaÐÔÄÜÓÅ»¯
Spring¿ò¼Ü
SSM¿ò¼Ü¼òµ¥¼òÉÜ
´ÓÁ㿪ʼѧjava±à³Ì¾­µä
Ïà¹Ø¿Î³Ì

¸ßÐÔÄÜJava±à³ÌÓëϵͳÐÔÄÜÓÅ»¯
JavaEE¼Ü¹¹¡¢ Éè¼ÆÄ£Ê½¼°ÐÔÄܵ÷ÓÅ
Java±à³Ì»ù´¡µ½Ó¦Óÿª·¢
JAVAÐéÄâ»úÔ­ÀíÆÊÎö