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

    }
}

原文地址:https://www.cnblogs.com/756623607-zhang/p/11211192.html

时间: 2024-10-08 13:25:33

【Spring Boot】Spring Boot之跨域解决方案的相关文章

跨域解决方案与提交订单

跨域解决方案与提交订单 课程目标  目标 1:掌握跨域请求 CORS 解决方案目标 2:完成结算页收货人地址选择功能目标 3:完成结算页支付方式选择目标 4:完成结算页商品清单功能目标 5:完成保存订单功能 1.商品详细页跨域请求  1.1 需求分析  从商品详细页点击“加入购物车”按钮,将当前商品加入购物车,并跳转到购物车页面. 1.2 JS 跨域请求  这里说的 js 跨域是指通过 js 在不同的域之间进行数据传输或通信,比如用 ajax 向一个不同的域请求数据,或者通过 js 获取页面中不

javascript跨域解决方案

最近遇到了https跨域访问http域的问题,很多朋友理所当然的认为简单,问题是https跨域访问到http域上的资源,会进行相互通信,没有解决该问题,只能把外部资源扔到了新浪的sae上,通过https访问,别跨什么协议域了,只跨主域即可! 附两篇跨域的文档 http://jiangzhenghua.iteye.com/blog/1221178 http://jiangzhenghua.iteye.com/blog/1221184 HTTPS页面包含HTTP内容时浏览器提示的绕过 http://

javascript 跨域解决方案

1 用jsonp $.getJSON(" http://www.jinanwuliangye.com/document!searchJSONResult.action?name1="+value1+"&jsoncallback=?", function(json){ if(json.属性名==值){ // 执行代码 } }); $.getJSON(" http://www.tongxinglong.com/document!searchJSONRe

跨域解决方案CORS使用方法

CORS(Cross-Origin Resource Sharing), 目前CORS还处于w3c的草案,它定义了跨域访问时服务器和客户端之间如何通信.他的原理是通过定义HTTP头部的信息,来让客户端和服务器互相确认,从而决定是否相应本次请求. 兼容性: IE10+  chrome21+  firefox21+  safari5.1+  opera12.1+ (IE8, 9中使用XDomainRequest) 详见 http://caniuse.com/cors , 可通过(new XMLHtt

js最全的十种跨域解决方案

在客户端编程语言中,如javascript和ActionScript,同源策略是一个很重要的安全理念,它在保证数据的安全性方面有着重要的意义.同 源策略规定跨域之间的脚本是隔离的,一个域的脚本不能访问和操作另外一个域的绝大部分属性和方法.那么什么叫相同域,什么叫不同的域呢? 同源策略 在客户端编程语言中,如javascript和 ActionScript,同源策略是一个很重要的安全理念,它在保证数据的安全性方面有着重要的意义.同源策略规定跨域之间的脚本是隔离的,一个域的脚本不能访问和操作另外一个

跨域解决方案二:使用JSONP实现跨域

跨域的实现方式有多种,除了 上篇文章 提到的CORS外,常见的还有JSONP.HTML5.Flash.iframe.xhr2等. 这篇文章对JSONP的跨域原理进行了探索,并将我的心得记录在这里和大家分享. JSONP跨域原理探秘 我们知道,使用 XMLHTTPRequest 对象发送HTTP请求时,会遇到 同源策略 问题,域不同请求会被浏览器拦截. 那么是否有方法能绕过 XMLHTTPRequest 对象进行HTTP跨域请求呢? 换句话说,不使用 XMLHTTPRequest 对象是否可以发送

前端常见跨域解决方案(全)

什么是跨域? 跨域是指一个域下的文档或脚本试图去请求另一个域下的资源,这里跨域是广义的. 广义的跨域: 1.) 资源跳转: A链接.重定向.表单提交 2.) 资源嵌入: <link>.<script>.<img>.<frame>等dom标签,还有样式中background:url().@font-face()等文件外链 3.) 脚本请求: js发起的ajax请求.dom和js对象的跨域操作等 其实我们通常所说的跨域是狭义的,是由浏览器同源策略限制的一类请求场

Atitit.js跨域解决方案attilax大总结&#160;后台java&#160;php&#160;c#.net的CORS支持

Atitit.js跨域解决方案attilax大总结 后台java php c#.net的CORS支持 1. 设置 document.domain为一致  推荐1 2. Apache 反向代理 推荐1 3. jsonp ,2 4. CORS ,2 5. iframe+post3 6. 回调解决方案>>服务端推送dwr 反向ajax3 7. 服务器中转 3 8. Js跨3 9. 从所有的浏览器都支持来看,CORS将成为未来跨域访问的标准解决方案3 10. 参考4 1. 设置 document.do

JSON跨域解决方案收集

最近面试问的挺多的一个问题,就是JavaScript的跨域问题.在这里,对跨域的一些方法做个总结.由于浏览器的同源策略,不同域名.不同端口.不同协议都会构成跨域:但在实际的业务中,很多场景需要进行跨域传递信息,这样就催生出多种跨域方法. 1. 具备src的标签 原理:所有具有 src 属性的HTML标签都是可以跨域的 在浏览器中, <script> . <img> . <iframe> 和 <link> 这几个标签是可以加载跨域(非同源)的资源的,并且加载的

前端常见跨域解决方案

什么是跨域? 跨域是指一个域下的文档或脚本试图去请求另一个域下的资源,这里跨域是广义的. 广义的跨域: 1.) 资源跳转: A链接.重定向.表单提交 2.) 资源嵌入:<link>.<script>.<img>.<frame>等dom标签,还有样式中background:url().@font-face()等文件外链 3.) 脚本请求: js发起的ajax请求.dom和js对象的跨域操作等 其实我们通常所说的跨域是狭义的,是由浏览器同源策略限制的一类请求场景