一、什么是跨域
跨域,指的是从一个域名去请求另外一个域名的资源。即跨域名请求!跨域时,浏览器不能执行其他域名网站的脚本,是由浏览器的同源策略造成的,是浏览器施加的安全限制。
跨域的严格一点来讲就是只要协议,域名,端口有任何一个的不同,就被当作是跨域。
常见于前端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; } } }
原文地址:https://www.cnblogs.com/756623607-zhang/p/11211192.html
时间: 2024-10-08 13:25:33