前后端分离跨域问题解决方案

问题

  因为最近在学习vue和springboot.用到了前后端分离.前端webpack打包运行的时候会启动nodejs的服务器占用8080端口,后端springboot自带tomcat启动占用1111端口(我自己设置的)...导致前端请求的ajax到后台会产生跨域问题...然后自己试了试发现有2种办法都可以解决.

利用SpringMVC @CrossOrigin注解

1 package com.labofjet.system.controller;
2
3 import org.slf4j.Logger;
4 import org.slf4j.LoggerFactory;
5
6 //@CrossOrigin(value = "*", allowCredentials = "true")
7 public class BaseController {
8     protected Logger log = LoggerFactory.getLogger(this.getClass());
9 }

CrossOrigin这个注解可以允许ajax跨域请求....但是有个很明显的缺点就是ajax会请求2次,第一次请求类型是options.查看是不是允许发起跨域请求.然后才会发起get呀post呀这样的请求...这就很蛋疼了.相当于需要花费额外的时间再请求上.毕竟请求次数翻倍了.

另外如果要传输cookies的话似乎需要额外设置

allowCredentials = "true"

具体我也没试过.因为那个时候我用另外一种方法去解决了,不过看api文档上是说设置成true就可以解决了..

这种方式除了请求次数变多以外,我感觉还有1个主要问题就是你得设置你允许哪些站点跨域访问你..你为了开发方便设置成*...那么实际上了生产..别人哪个域名都可以给你发跨域请求..这就很尴尬了..而且注解是写在代码里的.你很难在生产和开发中分别设置不同的值.

使用nginx作为反向代理

所以就有了这种方法...我觉得这是一种比较好的解决办法..为什么呢?

因为使用nginx作为反向代理的时候前端用户浏览器访问的是nginx的地址,是一个地址,ajax请求的地址也是这个地址,只是在nginx里配置了去找后台的api.所以没有跨域的问题的.

具体做法:

首先设置nginx代理所有请求

    server {
        listen       1112;
        server_name  127.0.0.1;

        location / {
            proxy_pass http://127.0.0.1:8080/;
        }
    }

比如监听1112端口,所有请求都转发到8080的前端nodejs端口.

然后再配置后台数据的接口,比如/api/开头的请求都转发给springboot后台1111端口.

        location /api/ {
            proxy_pass http://127.0.0.1:1111/;
            #index  index.html index.htm;
        }

那么这样做的话需要前端代码里所有的ajax请求都加上api开头前缀...所以需要统一配置下...

 1 const ajaxUrl = env === ‘development‘
 2     ? ‘/api‘
 3     : env === ‘production‘
 4         ? ‘https://www.url.com‘
 5         : ‘https://debug.url.com‘;
 6
 7 util.ajax = axios.create({
 8     baseURL: ajaxUrl,
 9     timeout: 30000
10 });

我前端ajax用的是axios...可以配置baseURL去控制请求的地址的前缀.所以还是蛮方便的.

这样就完成了.在用户浏览器看上去前后台数据都是从1112端口发来的,并不知道nginx做了反向代理.所有cookies也都写在1112端口下.所以没有跨域问题也没有cookies的问题.

小结

通过nginx或者其他反向代理工具把请求转发给前台和后台服务器可以比较方便的解决前后端分离跨域问题.

时间: 2024-10-04 17:17:44

前后端分离跨域问题解决方案的相关文章

Django前后端分离跨域请求问题

一.问题背景 之前使用django+vue进行前后端分离碰到跨域请求问题,跨域(域名或者端口不同)请求问题的本质是由于浏览器的同源策略导致的,当请求的响应不是处于同一个域名和端口下,浏览器不会接受响应,同源策略也是浏览器针对请求的安全问题所作出的一种保护行为.针对跨域问题,可以有下面的解决方式: JSONP方式 自定义中间件,设置响应头 使用django-cors-headers包 二.解决方式 (一)自定义中间件 JSONP本质上是利用html的一些不受同源策略影响的标签属性src,例如:<a

关于.Net Core 前后端分离跨域请求时 ajax并发请求导致部分无法通过验证解决办法。

项目中有这样一个页面.页面加载的时候会同时并发6个ajax请求去后端请求下拉框. 这样会导致每次都有1~2个"浏览器预请求"不通过. 浏览器为什么会自动发送"预请求"?请看以面连接 https://blog.csdn.net/charleslei/article/details/51906635 那么解决办法无非就是尽量避免发送"预请求". 后来经过反复测试发现"预请求"可以通过设置Access-Control-Max-Age

node与vue结合的前后端分离跨域问题

第一点:node作为服务端提供数据接口,vue使用axios访问接口, 安装axios npm install axios --save 安装完成后在main.js中增加一下配置: import axios from 'axios'; axios.defaults.withCredentials=true Vue.prototype.$axios = axios; main.js全部配置如下: import Vue from 'vue' import App from './App' impor

llaravel 前后端分离跨域问题

使用 laravel-cors 实现 Laravel 的跨域配置 一.需求 一个项目需要进行前端跨域,不适用 jsonp. 因此需要进行 cors 的设置. 最开始的时候,我使用的是路由中间件的方式,但是发现中间件不起作用. // 路由中间件 public function handle($request, Closure $next) { $response = $next($request); $response->header('Access-Control-Allow-Origin',

nginx配置反向代理解决前后端分离跨域问题

摘自<AngularJS深度剖析与最佳实践>P132 nginx配置文件如下: server { listen 80; server_name your.domain.name; location / { # 把跟路径下的请求转发给前端工具链(如gulp)打开的开发服务器 # 如果是产品环境,则使用root等指令配置为静态文件服务器 proxy_pass http://localhost:5000/; } location /api/ { # 把 /api 路径下的请求转发给真正的后端服务器

springboot+angular4前后端分离 跨域问题

springboot中新增一个过滤器如下: package com.rtpksps.kss.config;import org.springframework.stereotype.Component;import javax.servlet.*;import javax.servlet.http.HttpServletResponse;import java.io.IOException; /** * @author Administrator * @title: OriginFilter *

springboot前后端分离跨域

@Configurationpublic class CrossConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("*") .allowCredentials(true) .allowedMethods("GET"

前后端分离跨服务器文件上传-Java SpringMVC版

近来工作上不上特别忙,加上对后台java了解一点,所以就抽时间,写了一个java版本的前后端分离的跨服务器文件上传功能,包括前后端代码. 一.Tomcat服务器部分 1.Tomcat服务器 单独复制一份Tomcat,用来作为文件服务器 1.1 xml文件: 需要在该Tomcat的conf目录下的web.xml文件的大概100行添加如下部分: 1.2 server.xml文件: 需要在该Tomcat的conf目录下的server.xml文件做一些端口的修改 1.3 Tomcat下建立文件夹 在该T

webpack 前后端分离开发接口调试解决方案,proxyTable解决方案

如果你有单独的后端开发服务器 API,并且希望在同域名下发送 API 请求 ,那么代理某些 URL 会很有用. dev-server 使用了非常强大的 http-proxy-middleware 包.更多高级用法,请查阅其文档. 在 localhost:3000 上有后端服务的话,你可以这样启用代理: proxy: { "/api": "http://localhost:3000" } 请求到 /api/users 现在会被代理到请求 http://localhos