【springboot】【若依(ruoyi)】@RestController 接口跨域请求

前言

  • springboot 2.1.1.RELEASE
  • 360极速浏览器 12.0.1476.0 (正式版本) (32 位)
  • jquery 3.5.0
  • 接口跨域请求有两者方式:
    • jsonp
    • CORS

JSONP

JSONP(JSON with Padding)是利用浏览器对script的资源引用没有同源限制,通过动态插入一个script标签,当资源加载到页面后会立即执行的原理实现跨域的。

JSONP是一种非正式传输协议,具体做法是:用户传递一个callback参数给服务端。服务端返回数据时用callback参数包裹住JSON数据,形如callback({name:'zhangsan',age:18})

JSONP只支持GET请求(不支持POST等其它类型的HTTP请求),它只支持跨域HTTP请求这种情况,不能解决不同域的两个页面之间如何进行JavaScript调用的问题。

JSONP的优势在于支持老式浏览器,弊端也比较明显:需要客户端和服务端定制进行开发。

CORS

Cross-Origin Resource Sharing (CORS) 是W3c工作草案,它定义了在跨域访问资源时浏览器和服务器之间如何通信。CORS背后的基本思想是使用自定义的HTTP头部允许浏览器和服务器相互了解对方,从而决定请求或响应成功与否。

CORS的具体做法为:浏览器发现请求不符合同源策略时,给请求加一个请求头Origin。服务端如果接受请求则在返回结果中加入一个响应头Access-Control-Allow-Origin

CORS与JSONP的使用目的相同,但是比JSONP更强大。CORS支持所有的浏览器请求类型,承载的请求数据量更大(因为URL是有长度限制的,参考这里。以目前的技术看,URL没有长度限制,那是不可想象的)。

CORS也不是万能的,老旧的浏览器就不支持。

CORS请求分成两类:简单请求(simple request)和非简单请求(not-so-simple request)。下面的方法只在简单请求下做了测试。

springboot 启用 @CrossOrigin

springboot很贴心的提供了不同粒度的控制。这里介绍全局设置。

  1. 添加注解@CrossOrigin

    @CrossOrigin(origins = {"*"})
    @SpringBootApplication
    public class Application {
    ...
    }
    

    说明:origins 不建议使用*(为了方便这里用*。实际应用时,老老实实的一个一个的添加)。

  2. addCorsMappings

    @Configuration
    public class WebConfig implements WebMvcConfigurer {
    
    	@Override
    	public void addCorsMappings(CorsRegistry registry) {
    		registry.addMapping("/api/**");
    	}
    	
    }
    
  3. 测试
    测试代码略。
    Http 请求如下(http://localhost:8085/api/sample/form/get1):

    GET /api/sample/form/get1 HTTP/1.1
    Host: localhost:8085
    Connection: keep-alive
    Accept: */*
    Origin: null
    User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36
    Sec-Fetch-Site: cross-site
    Sec-Fetch-Mode: cors
    Accept-Encoding: gzip, deflate, br
    Accept-Language: zh-CN,zh;q=0.9
    

    Http 响应如下:

    HTTP/1.1 200
    Vary: Origin
    Vary: Access-Control-Request-Method
    Vary: Access-Control-Request-Headers
    Access-Control-Allow-Origin: *
    Content-Type: application/json;charset=UTF-8
    Transfer-Encoding: chunked
    Date: Fri, 04 Sep 2020 06:09:46 GMT
    

参考

https://www.cnblogs.com/banning/p/6250677.html
https://zhuanlan.zhihu.com/p/38972475
https://www.cnblogs.com/zhaosq/p/10529803.html

猜你喜欢

转载自blog.csdn.net/sayyy/article/details/108402412