> Java > java지도 시간 > SpringBoot에서 Ajax 도메인 간 및 쿠키 오류 문제를 해결하는 방법

SpringBoot에서 Ajax 도메인 간 및 쿠키 오류 문제를 해결하는 방법

王林
풀어 주다: 2023-05-26 09:56:13
앞으로
1572명이 탐색했습니다.

내 프로젝트의 로그인 등록 페이지 작성 시 내 등록 및 비밀번호 변경 기능은 이메일 인증을 사용하기 때문에 인증 코드를 보낼 때 백엔드에서 응답 데이터에 쿠키를 추가합니다

Cookie cookie = new Cookie(toEmail.split("@")[0],verCode);
cookie.setMaxAge(30*60);
response.addCookie(cookie);
로그인 후 복사

그런 다음 테스트할 때 등록 또는 비밀번호 변경을 클릭하세요. , 백엔드는 이메일 및 인증 코드 정보를 얻기 위해 요청에서 쿠키를 얻습니다

Cookie[] cookies = request.getCookies();
로그인 후 복사

로컬에서 테스트할 때 쿠키는 응답에 올바르게 추가되고 올바르게 얻을 수 있습니다

SpringBoot에서 Ajax 도메인 간 및 쿠키 오류 문제를 해결하는 방법

SpringBoot에서 Ajax 도메인 간 및 쿠키 오류 문제를 해결하는 방법

그러나 패키징할 때는 프로젝트 클라우드로 이동 후 Ajax 접속시 문제가 발생했습니다. 쿠키 획득에 실패했습니다!

응답 헤더에 명확하게 set-Cookie가 있지만 두 번째 요청 헤더에는 쿠키가 없습니다

서버 획득에 실패했습니다. 쿠키를 사용하여 비밀번호를 등록하고 변경하는 기능이 비활성화되어 있다고 문서를 검색한 결과 백엔드를 처음 사용하기 때문에 springboot 및 ajax의 도메인 간 쿠키 손실 문제로 인해 오류가 발생한 것으로 나타났습니다. , 여기에만 게시하겠습니다.

1. ajax 요청에는

xmlhttp.withCredentials = true;

var xmlhttp = new XMLHttpRequest();
xmlhttp.withCredentials = true;
xmlhttp.open("GET", readyUrl, true);
xmlhttp.send();
로그인 후 복사
2. corsConfig 구성 클래스를 추가해야 합니다. 오류를 찾아보세요. )

package com.crisp.myblog.config;
 
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 
 
@Configuration
public class corsConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                //是否发送Cookie
                .allowCredentials(true)
                //放行哪些原始域
                .allowedOriginPatterns("这里填你前端代码所在的域名:端口")
                .allowedMethods(new String[]{"GET", "POST", "PUT", "DELETE"})
                .allowedHeaders("*")
                .exposedHeaders("*");
    }
}
로그인 후 복사

3. 컨트롤러의 API 응답은 응답 헤더를 설정하고,

는 "Access-Control-Allow-Origin" 액세스 제어 허용 소스, http 요청 헤더 정보, 소스

response.setHeader("Access-Control-Allow-Origin",request.getHeader("Origin"));
로그인 후 복사
를 설정합니다.

리소스 공유(도메인 간)를 허용하는 값 ​​

은 request.getHeader("Origin")이며, 이는 현재 요청된 리소스가 위치한 페이지의 프로토콜 및 도메인 이름

나타내기 위해 결합되어 허용을 나타냅니다. 도메인 전체의 백엔드 리소스에 액세스하기 위해 현재 요청된 리소스

이 세 부분을 설정한 후 쿠키를 다시 얻을 수 있었습니다

2022-12-09 업데이트:

더 간결하고 편리한 것을 찾았습니다 도메인 간 요청 필터를 추가하는 방법

Druid 데이터 풀 종속성 패키지의 StringUtils를 사용합니다. isEmpty 방법, 오류가 보고되면 직접 대체 항목을 작성하세요🎜
import com.alibaba.druid.util.StringUtils;
import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
 
 
@Component
public class crispFilter implements Filter {
 
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        Filter.super.init(filterConfig);
    }
 
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest)servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        System.out.println("跨域请求过滤器启动");
        if (request.getRequestURL().toString().matches(".+.ico$")) {
            filterChain.doFilter(servletRequest, servletResponse);
        } else {
            String origin = request.getHeader("Origin");
            // 简单请求跨域,如果是跨域请求在响应头里面添加对应的Origin
            if (!StringUtils.isEmpty(origin)) {
                response.addHeader("Access-Control-Allow-Origin", origin);
            }
            // 非简单请求跨域
            response.addHeader("Access-Control-Allow-Headers", "content-type");
            // 允许跨域请求的方法
            response.addHeader("Access-Control-Allow-Methods", "*");
            // 携带cookie的跨域
            response.addHeader("Access-Control-Allow-Credentials", "true");
 
            // 放行方法
            filterChain.doFilter(servletRequest, servletResponse);
        }
    }
 
    @Override
    public void destroy() {
        Filter.super.destroy();
    }
}
로그인 후 복사

위 내용은 SpringBoot에서 Ajax 도메인 간 및 쿠키 오류 문제를 해결하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:yisu.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿