前后端分离需要跨域怎么办

3 篇文章 0 订阅
3 篇文章 0 订阅

原理什么的这里不多说,网上太多了。

为什么会产生跨域

出于浏览器的同源策略限制。同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。同源策略会阻止一个域的javascript脚本和另外一个域的内容进行交互。所谓同源就是两个页面或者前后端的两个地址具有相同的协议(protocol),主机(host)和端口号(port)

什么情况下会产生跨域

页面地址

接口地址

是否会产生跨域

原因

http://www.ccc.com/index

http://www.ccc1.com

同源

http://www.ccc.com/index

https://www.ccc1.com

协议不同

http://www.ccc.com/index

http://www.bbb.com

域名不同

http://www.ccc.com/index

http://www.ccc1.com:8888

端口不通

原则原则当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同就会产生跨域

前后端项目中跨域的解决办法

工具:nginx+tomcat

方法一

       使用nginx代理,不改动任何前后端代码。

       配置demo如下

server {
		listen 80;
		server_name www.ccc.com;
		
		#接口地址服务
		location / {
			proxy_pass http://localhost:8886/app/;
			proxy_set_header   Host $host:80;
			proxy_read_timeout 2000;
			client_max_body_size    1000m;
			proxy_set_header   X-Forwarded-Scheme  $scheme;
			proxy_set_header   X-Real-IP   $remote_addr;
			proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;
			proxy_set_header Via "nginx";
		}
		
		location /index{
			alias /home/dist; 
			expires  7d;
			index index.html;
			autoindex on;
		}
		
	}

方法二

使用JSONPJSONP 是服务器与客户端跨源通信的常用方法。最大特点就是简单适用,兼容性好(兼容低版本IE),缺点是只支持get请求,不支持post请求。

//ajax实现:
$.ajax({
    url: 'http://www.bbb.com:8080/login’,
    type: 'get',
    dataType: 'jsonp',  // 请求方式为jsonp
    jsonpCallback: "handleCallback",    // 自定义回调函数名
    data: {}
});


//Vue中实现:
this.$http.jsonp(' http://www.bbb.com:8080/login', {
    params: {},
    jsonp: 'handleCallback'
}).then((res) => {
    console.log(res); 
})

方法三

使用CORS,主要是服务端通过设置Access-Control-Allow-Origin来进行的。如果浏览器检测到相应的设置,就可以允许浏览器进行跨域的访问。

该方式只需要在写接口的时候对需要开放跨域的接口进行配置,前端不需要进行配置就可以直接调用,使用方便,限制小,部署时也不需要担心是否同源问题,不局限于GET调用方式。

1、在spring mvc中可使用XML配置方式,demo如下,更多配置细节可自行百度:

   <mvc:cors>
        <mvc:mapping path="/**"
                     allowed-origins="*"
                     allowed-methods="POST, GET, OPTIONS, DELETE, PUT"
                     allowed-headers="Content-Type, Access-Control-Allow-Headers,Access-Control-Allow-Methods,Access-Control-Allow-Origin
,Authorization, X-Requested-With"
                     exposed-headers="header1, header2"
                     allow-credentials="true" />
    </mvc:cors>

2、spring boot中配置demo如下,更多配置细节可自行百度

@Configuration
public class SwaggerConfig extends WebMvcConfigurationSupport {

    /**
     * 跨域设置
     *
     * @author
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowedMethods("GET", "POST", "OPTIONS", "PUT")
                .allowedHeaders("Content-Type", "X-Requested-With", "accept", "Origin", "Access-Control-Request-Method",
                        "Access-Control-Allow-Headers","Authorization","timestamp","access-control-request-headers")
                .exposedHeaders("Access-Control-Allow-Origin", "Access-Control-Allow-Credentials")
                .allowCredentials(true).maxAge(3600);
    }
}

方法四

Vue本地进行跨域,在项目中config->index.js中进行配置,注意部署时,要和接口地址同源,可参照方式一。

                                 

总结

跨域跨域是因为不在同一域下,所以要保证一个原则,就是想办法将两个或多个域名映射到同一域下。

                                                                                 

                                                                                  欢迎扫码关注公众号

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值