찾다
Javajava지도 시간springboot는 도메인 간 문제를 어떻게 해결합니까?

이 기사의 내용은 springboot가 도메인 간 문제를 어떻게 해결하는지에 관한 것입니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.

1. 교차 도메인 HTTP 요청이란 무엇입니까? 보안상의 이유로 최신 브라우저는 XMLHttpRequest 객체를 사용하여 HTTP 요청을 시작할 때 동일 출처 정책을 준수해야 합니다. 이는 기본적으로 금지되어 있습니다. 도메인 간 HTTP 요청은 도메인 B의 리소스를 요청하는 도메인 A의 리소스를 참조합니다. 예를 들어 시스템 A의 Nginx에 배포된 js 코드는 ajax를 통해 시스템 B의 Tomcat에 배포된 RESTful 인터페이스를 요청합니다. (권장: Java 비디오 튜토리얼

)

IP(도메인 이름) 또는 포트가 다르면 도메인 간 문제가 발생할 수 있습니다. 크로스 도메인 문제를 해결하기 위해 HTML5가 CORS 프로토콜을 도입하기 전까지는 애플리케이션 시나리오가 제한되어 있었고 유지 관리 비용이 높았습니다.

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 주석을 사용할 수 있습니다.

1. 새 CorsFilter(전역 교차 도메인) 반환

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. 주석 사용(로컬 크로스 도메인)

메서드에서 @CrossOrigin 주석 사용(@RequestMapping):

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

또는 컨트롤러에서 @CrossOrigin 주석 사용(@Controller):

@Controller
@CrossOrigin(origins = "http://xx-domain.com", maxAge = 3600)
public class AccountController {

    @RequestMapping("/hello")
    @ResponseBody
    public String index( ){
        return "Hello World";
    }
}

Set 수동으로 응답 헤더(부분 교차 도메인)

  1. HttpServletResponse 개체를 사용하여 응답 헤더(Access-Control-Allow-Origin)를 추가하여 원래 도메인을 인증할 수도 있습니다. 여기에서 Origin 값을 "*"로 설정할 수도 있습니다. , 모두 허용됨을 나타냅니다.
  2. @RequestMapping("/hello")
    @ResponseBody
    public String index(HttpServletResponse response){
        response.addHeader("Access-Control-Allow-Origin", "http://localhost:8080");
        return "Hello World";
    }
3. 도메인 간 액세스 테스트

먼저 아무것도 변경하지 않고 Maven 프로젝트를 빠르게 빌드하려면 index.html 페이지를 추가하여 도메인 간 액세스를 시뮬레이션하세요. 대상 주소: http://localhost:8090/hello

nbsp;html>


    <meta>
    <title>Page Index</title>


<h2 id="前台系统">前台系统</h2>
<p></p>

<script></script>
<script>
    $.ajax({
        url: &#39;http://localhost:8090/hello&#39;,
        type: "POST",
        xhrFields: {
           withCredentials: true //允许跨域认证
        },
        success: function (data) {
            $("#info").html("跨域访问成功:"+data);
        },
        error: function (data) {
            $("#info").html("跨域失败!!");
        }
    })
</script>
그런 다음 다른 프로젝트를 생성하고 루트 패키지에 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 데이터를 수신할 수 있으며 이는 교차 도메인 액세스에 성공했음을 나타냅니다! !


위 내용은 springboot는 도메인 간 문제를 어떻게 해결합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
이 기사는 segmentfault에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제
Java의 플랫폼 독립성을 위협하거나 향상시키는 새로운 기술이 있습니까?Java의 플랫폼 독립성을 위협하거나 향상시키는 새로운 기술이 있습니까?Apr 24, 2025 am 12:11 AM

신흥 기술은 위협을 일으키고 Java의 플랫폼 독립성을 향상시킵니다. 1) Docker와 같은 클라우드 컴퓨팅 및 컨테이너화 기술은 Java의 플랫폼 독립성을 향상 시키지만 다양한 클라우드 환경에 적응하도록 최적화되어야합니다. 2) WebAssembly는 Graalvm을 통해 Java 코드를 컴파일하여 플랫폼 독립성을 확장하지만 성능을 위해 다른 언어와 경쟁해야합니다.

JVM의 다른 구현은 무엇이며, 모두 같은 수준의 플랫폼 독립성을 제공합니까?JVM의 다른 구현은 무엇이며, 모두 같은 수준의 플랫폼 독립성을 제공합니까?Apr 24, 2025 am 12:10 AM

다른 JVM 구현은 플랫폼 독립성을 제공 할 수 있지만 성능은 약간 다릅니다. 1. OracleHotspot 및 OpenJDKJVM 플랫폼 독립성에서 유사하게 수행되지만 OpenJDK에는 추가 구성이 필요할 수 있습니다. 2. IBMJ9JVM은 특정 운영 체제에서 최적화를 수행합니다. 3. Graalvm은 여러 언어를 지원하며 추가 구성이 필요합니다. 4. AzulzingJVM에는 특정 플랫폼 조정이 필요합니다.

플랫폼 독립성은 개발 비용과 시간을 어떻게 줄입니까?플랫폼 독립성은 개발 비용과 시간을 어떻게 줄입니까?Apr 24, 2025 am 12:08 AM

플랫폼 독립성은 여러 운영 체제에서 동일한 코드 세트를 실행하여 개발 비용을 줄이고 개발 시간을 단축시킵니다. 구체적으로, 그것은 다음과 같이 나타납니다. 1. 개발 시간을 줄이면 하나의 코드 세트 만 필요합니다. 2. 유지 보수 비용을 줄이고 테스트 프로세스를 통합합니다. 3. 배포 프로세스를 단순화하기위한 빠른 반복 및 팀 협업.

Java의 플랫폼 독립성은 코드 재사용을 어떻게 촉진합니까?Java의 플랫폼 독립성은 코드 재사용을 어떻게 촉진합니까?Apr 24, 2025 am 12:05 AM

Java'SplatformIndenceFacilitatesCodereScoderEByWatHeAveringByTeCodetOrunonAnyPlatformwitHajvm.1) DevelopersCanwriteCodeOnceforConsentEStentBehaviorAcRossPlatforms.2) MAINTENDUCEDSCODEDOES.3) LIBRRIESASHSCORAREDERSCRAPERAREDERSPROJ

Java 응용 프로그램에서 플랫폼 별 문제를 어떻게 해결합니까?Java 응용 프로그램에서 플랫폼 별 문제를 어떻게 해결합니까?Apr 24, 2025 am 12:04 AM

Java 응용 프로그램의 플랫폼 별 문제를 해결하려면 다음 단계를 수행 할 수 있습니다. 1. Java의 시스템 클래스를 사용하여 시스템 속성을보고 실행중인 환경을 이해합니다. 2. 파일 클래스 또는 java.nio.file 패키지를 사용하여 파일 경로를 처리하십시오. 3. 운영 체제 조건에 따라 로컬 라이브러리를로드하십시오. 4. visualVM 또는 JProfiler를 사용하여 크로스 플랫폼 성능을 최적화하십시오. 5. 테스트 환경이 Docker Containerization을 통해 생산 환경과 일치하는지 확인하십시오. 6. githubactions를 사용하여 여러 플랫폼에서 자동 테스트를 수행하십시오. 이러한 방법은 Java 응용 프로그램에서 플랫폼 별 문제를 효과적으로 해결하는 데 도움이됩니다.

JVM의 클래스 로더 서브 시스템은 플랫폼 독립성에 어떻게 기여합니까?JVM의 클래스 로더 서브 시스템은 플랫폼 독립성에 어떻게 기여합니까?Apr 23, 2025 am 12:14 AM

클래스 로더는 통합 클래스 파일 형식, 동적로드, 부모 위임 모델 및 플랫폼 독립적 인 바이트 코드를 통해 다른 플랫폼에서 Java 프로그램의 일관성과 호환성을 보장하고 플랫폼 독립성을 달성합니다.

Java 컴파일러는 플랫폼 별 코드를 생성합니까? 설명하다.Java 컴파일러는 플랫폼 별 코드를 생성합니까? 설명하다.Apr 23, 2025 am 12:09 AM

Java 컴파일러가 생성 한 코드는 플랫폼 독립적이지만 궁극적으로 실행되는 코드는 플랫폼 별입니다. 1. Java 소스 코드는 플랫폼 독립적 인 바이트 코드로 컴파일됩니다. 2. JVM은 바이트 코드를 특정 플랫폼의 기계 코드로 변환하여 크로스 플랫폼 작동을 보장하지만 성능이 다를 수 있습니다.

JVM은 다른 운영 체제에서 멀티 스레딩을 어떻게 처리합니까?JVM은 다른 운영 체제에서 멀티 스레딩을 어떻게 처리합니까?Apr 23, 2025 am 12:07 AM

멀티 스레딩은 프로그램 대응 성과 리소스 활용을 향상시키고 복잡한 동시 작업을 처리 할 수 ​​있기 때문에 현대 프로그래밍에서 중요합니다. JVM은 스레드 매핑, 스케줄링 메커니즘 및 동기화 잠금 메커니즘을 통해 다양한 운영 체제에서 멀티 스레드의 일관성과 효율성을 보장합니다.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

맨티스BT

맨티스BT

Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

에디트플러스 중국어 크랙 버전

에디트플러스 중국어 크랙 버전

작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

ZendStudio 13.5.1 맥

ZendStudio 13.5.1 맥

강력한 PHP 통합 개발 환경

안전한 시험 브라우저

안전한 시험 브라우저

안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)