Vue项目启动报错: No ‘Access-Control-Allow-Origin‘ header

     刚开始学前端知识,在调用后端接口时出现:报错 

      has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource。

我的前后端时分开的,前端端口是8080,后端服务的端口是999。http请求是由axio来实现的。

import request from '@/utils/AxiosHttpUtil';

export default {
  getTableInfos(params) {
    let result = request({ url: 'http://localhost:9999/nodejs-service/nodejs/getList', method: 'get', params: params });
    return result;
  },
  page(params) {
    let result = request({ url: 'http://localhost:9999/nodejs-service/nodejs/page', method: 'post', data: params });
    return result;
  },
  submitData(params) {
    let result = request({ url: 'http://localhost:9999/nodejs-service/nodejs/formSubmit', method: 'post', data: params });
    return result;
  },
  getDocxData(params){
    let result = request({ url: 'http://localhost:9999/nodejs-service/nodejs/getFileData?' + params, method: 'get',responseType: 'blob' });
    return result;
  }
}

      在接口调用的时候就出现了,报错: .....has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource

     最后发现是跨域的问题。经过尝试目前发现有三种方式可以解决。

第一种:

        实现在返回的response中加入请求头。

@GetMapping("/getList")
    public List<UserInfoDto> getMethod(HttpServletRequest request, HttpServletResponse response){
        response.setHeader("Access-Control-Allow-Origin", "*");
        return Arrays.asList(new UserInfoDto("root","root", new Date(), "111111"),
                new UserInfoDto(), new UserInfoDto(UUID.randomUUID().toString(),"zhang", new Date(), "22222"),
                new UserInfoDto(),new UserInfoDto(), new UserInfoDto(), new UserInfoDto());
    }

这种方法要求每一个后端接口(可以跨域的接口)都需要加入代码。比较麻烦。

第二种:

后端配置统一的允许跨域的接口。

@Configuration
public class InterceptorConfigure extends WebMvcConfigurerAdapter {
    @Override
    public void addCorsMappings(CorsRegistry corsRegistry){
        /**
         * 所有请求都允许跨域,使用这种配置就不需要
         * 在interceptor中配置header了
         */
        corsRegistry.addMapping("/**")     //接口匹配
                .allowCredentials(true)
                .allowedOrigins("*")
                .allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE")
                .allowedHeaders("*")
                .maxAge(3600);
    }
}

这种方法比较实用,但是需要修改后端代码。

第三种:

前端配置跨域请求。

首先需要下载 http-proxy-middleware ,在项目下执行命令:

npm install http-proxy-middleware -save-dev

然后在项目的从config下建立一个proxyConfig.js文件。内容如下:

module.exports = {
  proxyList:{
    "/nodejs-service":{
      target:"http://localhost:9999",   //目的地的地址,需要有http://
      changeOrigin:true,    //必须,允许跨域
      pathRewrite:{  //重写路径
        //如:
        //不配置,则表示接口路径不变直接转发到指定的  服务http://localhost:9999上
        //  '^/nodejs-service/oldpath':'/nodejs-service/new-path',
        //  '^/nodejs-service':'',
      }
    }
  }
}

 然后在config的目录下的index.html中加入以下配置

定义变量:
const proxyConfig = require('./proxyConfig')

在dev下加入:
proxyTable: proxyConfig.proxyList,

 改变自己调用接口的地址,去掉IP信息:

import request from '@/utils/AxiosHttpUtil';

export default {
  getTableInfos(params) {
    let result = request({ url: '/nodejs-service/nodejs/getList', method: 'get', params: params });
    return result;
  },
  page(params) {
    let result = request({ url: '/nodejs-service/nodejs/page', method: 'post', data: params });
    return result;
  },
  submitData(params) {
    let result = request({ url: '/nodejs-service/nodejs/formSubmit', method: 'post', data: params });
    return result;
  },
  getDocxData(params){
    let result = request({ url: '/nodejs-service/nodejs/getFileData?' + params, method: 'get',responseType: 'blob' });
    return result;
  }
}

这样就完成了。

这个错误是由于浏览器的同源策略导致的。同源策略要求在进行跨域请求时,服务器必须在响应中包含特定的响应头信息 "Access-Control-Allow-Origin"。如果服务器没有正确配置这个响应头,浏览器会阻止访问返回数据。 要解决这个问题,有几种方法可以尝试: 1. 通过后端进行配置:在服务器端的响应中添加 "Access-Control-Allow-Origin" 头信息,并设置它的值为允许访问的域名或 "*"(表示允许来自所有域名的访问)。例如,在 Node.js 的 Express 框架中,可以使用如下代码添加该头信息: ```javascript app.use(function(req, res, next) { res.setHeader("Access-Control-Allow-Origin", "*"); // 其他响应头设置 next(); }); ``` 2. 使用代理:可以设置一个代理服务器,将前端的请求转发到目标服务器上,并在代理服务器上进行跨域配置。例如,在 Vue CLI 3+ 的项目中,可以在 vue.config.js 文件中配置代理: ```javascript module.exports = { devServer: { proxy: { "/api": { target: "http://目标服务器地址", changeOrigin: true, pathRewrite: { "^/api": "" // 如果接口路径中有 "/api" 前缀,去掉它 } } } } }; ``` 3. JSONP:如果后端支持 JSONP,可以使用 JSONP 发起跨域请求。JSONP 是通过动态创建 script 标签来实现的,因为浏览器对于 script 标签的跨域能力没有限制。但是,这种方法只适用于 GET 请求。 请根据你的具体场景选择适合的解决方案来解决这个问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值