【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;
        }

    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM