내 프로젝트의 로그인 등록 페이지 작성 시 내 등록 및 비밀번호 변경 기능은 이메일 인증을 사용하기 때문에 인증 코드를 보낼 때 백엔드에서 응답 데이터에 쿠키를 추가합니다
Cookie cookie = new Cookie(toEmail.split("@")[0],verCode); cookie.setMaxAge(30*60); response.addCookie(cookie);
그런 다음 테스트할 때 등록 또는 비밀번호 변경을 클릭하세요. , 백엔드는 이메일 및 인증 코드 정보를 얻기 위해 요청에서 쿠키를 얻습니다
Cookie[] cookies = request.getCookies();
로컬에서 테스트할 때 쿠키는 응답에 올바르게 추가되고 올바르게 얻을 수 있습니다
그러나 패키징할 때는 프로젝트 클라우드로 이동 후 Ajax 접속시 문제가 발생했습니다. 쿠키 획득에 실패했습니다!
응답 헤더에 명확하게 set-Cookie가 있지만 두 번째 요청 헤더에는 쿠키가 없습니다
서버 획득에 실패했습니다. 쿠키를 사용하여 비밀번호를 등록하고 변경하는 기능이 비활성화되어 있다고 문서를 검색한 결과 백엔드를 처음 사용하기 때문에 springboot 및 ajax의 도메인 간 쿠키 손실 문제로 인해 오류가 발생한 것으로 나타났습니다. , 여기에만 게시하겠습니다.
1. ajax 요청에는
xmlhttp.withCredentials = true; var xmlhttp = new XMLHttpRequest();
xmlhttp.withCredentials = true;
xmlhttp.open("GET", readyUrl, true);
xmlhttp.send();
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!