zoukankan      html  css  js  c++  java
  • 【Spring Boot】Spring 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("\[(\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;
            }
    
        }
    }
  • 相关阅读:
    浏览网页的过程
    端口转发和端口映射
    代码审计入门之BlueCMS v1.6 sp1
    php伪协议总结
    phar反序列化
    iOS开发之GCD使用总结
    深入理解Android NDK日志符号化
    Android 开源项目源码解析之DynamicLoadApk 源码解析
    Gilt如何将微服务部署到AWS环境,介绍ION-Roller
    100分程序员的8个习惯
  • 原文地址:https://www.cnblogs.com/756623607-zhang/p/11211192.html
Copyright © 2011-2022 走看看