一、什么是跨域
跨域,指的是從一個域名去請求另外一個域名的資源。即跨域名請求!跨域時,瀏覽器不能執行其他域名網站的腳本,是由瀏覽器的同源策略造成的,是瀏覽器施加的安全限制。
跨域的嚴格一點來講就是只要協議,域名,端口有任何一個的不同,就被當作是跨域。
常見於前端Ajax請求
二、如何模擬跨域請求
三、后台解決方案
1.步驟一:WebMvcConfigurer中添加跨域策略
@Configuration public class ApiSecurityConfig implements WebMvcConfigurer { /** * 跨域配置 * * @param registry */ @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") // TODO 這里跨域最好配置域名 .allowedOrigins("*") .maxAge(3600) .allowCredentials(true) .allowedMethods("GET", "POST", "OPTIONS"); } }
2.步驟二:統一異常處理方法中也需要添加跨域策略(防止發生Spring MVC相關錯誤導致第一種跨域策略失效的問題)
@RestControllerAdvice public class BaseControllerAdvice { private static final Logger logger = LoggerFactory.getLogger(BaseControllerAdvice.class); public static final Pattern ERROR_MESSAGE_PATTERN = Pattern.compile("\\[(\\d{4})\\] (.*)"); public BaseControllerAdvice() { } @ExceptionHandler public ApiResponse globalExceptionHandler(HttpServletRequest request, HttpServletResponse response, Exception ex) { //解決跨域訪問報錯 response.setHeader("Access-Control-Allow-Origin", "*"); logger.error("檢測到未捕捉異常:IP:{} invoke url:{} Exception:{}", new Object[]{request.getRemoteAddr(), request.getRequestURL(), ex.getClass().toGenericString(), ex}); ApiResponse apiResponse = new ApiResponse(ApiResponseCodeEnum.SYSTEM_EXCEPTION); if (ex instanceof ApiException) { Integer code = ((ApiException)ex).getCode(); return new ApiResponse(code, ex.getMessage()); } else { if (StringUtils.isNotBlank(ex.getMessage())) { Matcher matcher = ERROR_MESSAGE_PATTERN.matcher(ex.getMessage()); if (matcher.matches()) { logger.error(ex.getMessage(), ex); return apiResponse; } } return apiResponse; } } }