Spring BootSpring Boot之跨域解决方案

Posted 756623607-zhang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring BootSpring Boot之跨域解决方案相关的知识,希望对你有一定的参考价值。

一、什么是跨域

  跨域,指的是从一个域名去请求另外一个域名的资源。即跨域名请求!跨域时,浏览器不能执行其他域名网站的脚本,是由浏览器的同源策略造成的,是浏览器施加的安全限制。

跨域的严格一点来讲就是只要协议,域名,端口有任何一个的不同,就被当作是跨域。

  常见于前端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("\\\\[(\\\\d4)\\\\] (.*)");

    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;
        

    

 

以上是关于Spring BootSpring Boot之跨域解决方案的主要内容,如果未能解决你的问题,请参考以下文章

spring bootspring boot @ConditionalOnxxx相关注解总结

Spring BootSpring Boot项目部署到外部Tomcat容器

Spring BootSpring Boot之使用 Spring Data Elasticsearch 整合elasticsearch

Spring BootSpring Boot之自定义拦截器

spring bootspring cloud下spring boot微服务启动没有报错,但是访问访问不到

Spring BootSpring Boot 日志文件详解