이 기사의 내용은 springboot가 도메인 간 문제를 어떻게 해결하는지에 관한 것입니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.
1. 교차 도메인 HTTP 요청이란 무엇입니까? 보안상의 이유로 최신 브라우저는 XMLHttpRequest 객체를 사용하여 HTTP 요청을 시작할 때 동일 출처 정책을 준수해야 합니다. 이는 기본적으로 금지되어 있습니다. 도메인 간 HTTP 요청은 도메인 B의 리소스를 요청하는 도메인 A의 리소스를 참조합니다. 예를 들어 시스템 A의 Nginx에 배포된 js 코드는 ajax를 통해 시스템 B의 Tomcat에 배포된 RESTful 인터페이스를 요청합니다. (권장: Java 비디오 튜토리얼
)CORS는 W3C 표준이며 전체 이름은 "Cross-origin 리소스 공유"(Cross-origin 리소스 공유)입니다. 이를 통해 브라우저는 교차 출처 서버에 XMLHttpRequest 요청을 발행할 수 있으므로 AJAX만 사용할 수 있다는 제한을 극복할 수 있습니다. 같은 출신. 브라우저가 CORS를 지원하고 Origin이 통과했다고 판단하면 XMLHttpRequest가 도메인 간 요청을 시작할 수 있도록 허용됩니다. CROS 공통 헤더Access-Control-Allow-Origin: http://somehost.com은 http://somehost.com이 도메인 간 요청을 시작할 수 있음을 의미합니다.Access-Control-Max-Age:86400은 86400초 이내에 사전 확인 요청을 보낼 필요가 없음을 의미합니다.
Access-Control-Allow-Methods: GET, POST, PUT, DELETE는 도메인 간 요청을 허용하는 방법을 나타냅니다.Access-Control-Allow-Headers: 콘텐츠 유형은 도메인 간 요청에 콘텐츠 유형을 포함할 수 있음을 의미합니다
2. CORS는 도메인 간 액세스를 구현합니다
인증 방법방법 1: 새 CorsFilter 반환
방법 2: WebMvcConfigurer 다시 작성방법 3: 주석 사용(@CrossOrigin)
방법 4: 수동으로 응답 헤더 설정(HttpServletResponse)
참고: 방법 1과 2는 전역 CORS 구성에 속하고 방법 3과 4는 로컬 CORS 구성에 속합니다. . 로컬 교차 도메인을 사용하는 경우 전역 교차 도메인 규칙을 재정의하므로 보다 세부적인 교차 도메인 리소스 제어에 @CrossOrigin 주석을 사용할 수 있습니다.
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"); } }; } }
@RequestMapping("/hello") @ResponseBody @CrossOrigin("http://localhost:8080") public String index( ){ return "Hello World"; }
@Controller @CrossOrigin(origins = "http://xx-domain.com", maxAge = 3600) public class AccountController { @RequestMapping("/hello") @ResponseBody public String index( ){ return "Hello World"; } }
Set 수동으로 응답 헤더(부분 교차 도메인)
@RequestMapping("/hello") @ResponseBody public String index(HttpServletResponse response){ response.addHeader("Access-Control-Allow-Origin", "http://localhost:8080"); return "Hello World"; }
<!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", xhrFields: { withCredentials: true //允许跨域认证 }, success: function (data) { $("#info").html("跨域访问成功:"+data); }, error: function (data) { $("#info").html("跨域失败!!"); } }) </script> </html>
package com.hehe.yyweb.config; @Configuration public class GlobalCorsConfig { @Bean public WebMvcConfigurer corsConfigurer() { return new WebMvcConfigurer() { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**"); } }; } }
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); } }
위 내용은 springboot는 도메인 간 문제를 어떻게 해결합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!