`
y806839048
  • 浏览: 1126015 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

实现前后分离解决的跨域问题

阅读更多

   用nginx做代理即可,前端连接nginx,nginx的localtion的时候匹配的是域名之后的路劲,然后更换的也是域名部分,后面的路径直接拼接

   当然也可写正则表达式重写,改变这种拼接的规则

以下的例子是重写之后的

rewrite  ^.+apis/?(.*)$ /$1 break;

 

 

这里,我们利用Nginx的反向代理功能解决跨域问题,至于,什么是Nginx的反向代理,大家就请自行百度或者谷歌吧。

 

nginx作为反向代理服务器,就是把http请求转发到另一个或者一些服务器上。通过把本地一个url前缀映射到要跨域访问的web服务器上,就可以实现跨域访问。对于浏览器来说,访问的就是同源服务器上的一个url。而nginx通过检测url前缀,把http请求转发到后面真实的物理服务器。并通过rewrite命令把前缀再去掉。这样真实的服务器就可以正确处理请求,并且并不知道这个请求是来自代理服务器的。

 

具体解决方案如下:

 

在nginx.conf中编辑

 

server {

        location / {

            root   html;

            index  index.html index.htm;

            //允许cros跨域访问

            add_header 'Access-Control-Allow-Origin' '*';

 

        }

        //自定义本地路径

        location /apis {

            rewrite  ^.+apis/?(.*)$ /$1 break;

            include  uwsgi_params;

            proxy_pass   http://www.lyz.com;

       }

}

然后我把项目部署在nginx的html根目录下,在ajax调用时设置url从http://www.lyz.com/apistest/test变为/apis/apistest/test然后成功解决。

 

比如我之前请求的Ajax如下:

 

$.ajax({

        type:"post",

        dataType: "json",

        data:{'parameter':JSON.stringify(data)},

        url:"http://www.lyz.com/apistest/test",

        async: flag,

        beforeSend: function (xhr) {

 

            xhr.setRequestHeader("Content-Type", submitType.Content_Type);

            xhr.setRequestHeader("user-id", submitType.user_id);

            xhr.setRequestHeader("role-type", submitType.role_type);

            xhr.setRequestHeader("access-token", getAccessToken().token);

        },

        success:function(result, status, xhr){

     

        }

        ,error:function (e) {

            layerMsg('请求失败,请稍后再试')

        }

    });

修改成如下的请求即可:

 

$.ajax({

        type:"post",

        dataType: "json",

        data:{'parameter':JSON.stringify(data)},

        url:"/apis/apistest/test",

        async: flag,

        beforeSend: function (xhr) {

 

            xhr.setRequestHeader("Content-Type", submitType.Content_Type);

            xhr.setRequestHeader("user-id", submitType.user_id);

            xhr.setRequestHeader("role-type", submitType.role_type);

            xhr.setRequestHeader("access-token", getAccessToken().token);

        },

        success:function(result, status, xhr){

     

        }

        ,error:function (e) {

            layerMsg('请求失败,请稍后再试')

        }

    });

至此,问题解决。

 

 例如:

 

前后分离的时候,第一个login页面是在前端,其他的页面也是在前端,此时拦截的是前端发起接口的路径特征

 

对于网上源码需要改造成前后分离的,此时nginx的跨域处理不要误以为直接访问nginx到源码首页就可-----这种只是代理分发---负载均衡

而是需要拦截前端发起请求接口的特征

 

前端项目源码:

 

export default {

  dev: {

    host: '/api/v3',

    shareHost: '/share.html'

  },

  production: {

  //  host: '/api/v1',

    host: '/api/v3',

    shareHost: '/share.html'

  }

}

 

配置:

upstream apachephp  {

    server 192.168.202.183:8080; #Apache-----后端项目源码地址

}

 

    server {

        listen       8089;

        server_name  localhost;

 

        #charset koi8-r;

 

        #access_log  logs/host.access.log  main;

 

       

 

     location / {---------------一般用精确的项目特征路劲

        proxy_pass  http://apachephp;

 

        #Proxy Settings

        proxy_redirect     off;

        proxy_set_header   Host             $host;

        proxy_set_header   X-Real-IP        $remote_addr;

        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;

        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;

        proxy_max_temp_file_size 0;

        proxy_connect_timeout      90;

        proxy_send_timeout         90;

        proxy_read_timeout         90;

        proxy_buffer_size          4k;

        proxy_buffers              4 32k;

        proxy_busy_buffers_size    64k;

        proxy_temp_file_write_size 64k;

   }

 

     location /api {---------------一般用精确的项目特征路劲,域名部分替换

        proxy_pass  http://apachephp;

 

        #Proxy Settings

        proxy_redirect     off;

        proxy_set_header   Host             $host;

        proxy_set_header   X-Real-IP        $remote_addr;

        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;

        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;

        proxy_max_temp_file_size 0;

        proxy_connect_timeout      90;

        proxy_send_timeout         90;

        proxy_read_timeout         90;

        proxy_buffer_size          4k;

        proxy_buffers              4 32k;

        proxy_busy_buffers_size    64k;

        proxy_temp_file_write_size 64k;

   }

 

 

 

 

 

原文链接:https://blog.csdn.net/l1028386804/article/details/79488328

分享到:
评论

相关推荐

    C#web项目前后端分离跨域解决[Demo].zip

    在这个"**C#web项目前后端分离跨域解决[Demo]**"中,我们主要探讨的是如何在这样的环境中解决跨域问题。 跨域是Web应用程序中一个常见的安全限制,由于浏览器的同源策略,前端请求通常只能发送到同一域名下,这限制...

    nginx解决前后分离开发跨域问题

    接下来,我们要修改Nginx的配置以解决跨域问题。有两个关键部分需要关注,即`http`块和`server`块。在`http`块中,你可以设置全局的跨域策略,例如: ```nginx http { ... # 允许所有来源访问 add_header Access...

    Tomcat+Nginx反向代理部署前后端分离项目解决跨域问题

    最近自己做了一个前后端分离项目,前端采用HBuilderX开发,后端采用IDEA开发,在本地开发也跨域,部署到云服务器也跨域,下面介绍两种解决方案。 出于浏览器的同源策略限制。同源策略(Sameoriginpolicy)是一种约定...

    vue+springboot前后端分离实现单点登录跨域问题解决方法

    最近在做一个后台管理系统,前端是用时下火热的vue.js,后台是基于springboot...我面临的第一个问题是跨域,浏览器控制台直接报CORS,以我多年开发经验,我果断在后台配置了跨域配置,代码如下: @Configuration publi

    javascript插件 解决双向跨域问题

    然而,有时我们需要在不同的域之间进行数据交换,例如API调用或共享cookies,这时就需要解决跨域问题。本文将深入探讨JavaScript插件如何解决双向跨域问题,并通过具体的插件实例——jcrossdomain,来阐述其实现方式...

    SpringBoot+Vue前后端分离实现请求api跨域问题

    在Vue项目中,我们可以使用代理来解决跨域问题。我们可以在项目中创建一个vue.config.js文件,并在其中配置代理。下面是一个简单的示例代码: ``` module.exports = { devServer: { proxy: { '/api':{ target: '...

    vue+前后端的跨域问题解决b sesson不一样解决.zip

    4. **后端代理**:在开发阶段,由于Vue CLI提供了一个本地服务器,可以配置代理来解决跨域问题。在`vue.config.js`中添加以下代码: ```javascript module.exports = { devServer: { proxy: { '/api': { ...

    前后端分离-跨域解决方案.docx

    综上所述,无论是使用注解还是过滤器的方式,CORS都是解决跨域问题的有效手段。选择哪种方式取决于具体的应用场景和技术栈。在实际开发中,开发者可以根据项目需求和团队偏好来选择合适的实现方式。

    解决springboot实现跨域session共享问题

    本文将详细讲解如何在Spring Boot应用中解决跨域session共享的问题,并探讨防止SQL注入的相关策略。 首先,让我们理解什么是跨域。跨域是指由于浏览器的同源策略限制,不同域名、协议或端口之间的页面无法直接通信...

    vue+springboot前后端分离实现单点登录跨域问题处理.doc

    为了解决跨域问题,我们需要在我们的登录拦截器中添加一个 OPTIONS 请求的处理。我们可以在拦截器中添加一个 `OPTIONS` 方法来处理这个请求。 ```java @Override public boolean preHandle(HttpServletRequest ...

    解决 springboot跨域请求问题

    Nginx可以配置为将前端和后端的请求路由到相应的服务器,从而隐藏真实的服务器地址,同时也解决了跨域问题。在Nginx配置文件中,你可以添加一个新的location块来代理后端服务。例如: ```nginx location / { ...

    Ajax跨域问题及其解决方案.docx

    针对上述问题,我们可以通过多种方式来解决跨域问题,下面将详细介绍这些解决方案。 ##### 1. 修改浏览器(不推荐) 这种方法涉及到改变浏览器的行为,例如通过添加启动参数`--disable-web-security`来禁用同源...

    Ajax跨域访问解决方案

    这种方式适用于前后端分离的架构,前端通过与同一源的代理服务器通信,实现跨域。 5. **Window.postMessage** `window.postMessage` API允许来自不同源的窗口进行通信,包括弹出窗口、框架、嵌入内容等。两个窗口...

    解决前后端分离 vue+springboot 跨域 session+cookie失效问题

    解决跨域问题通常采用CORS(Cross-Origin Resource Sharing)机制。 在Spring Boot中,可以通过自定义过滤器CORSFilter来处理跨域请求。在给出的示例代码中,创建了一个名为CORSFilter的过滤器,该过滤器拦截所有...

    解决Vue调用springboot接口403跨域问题

    在当前的Web开发中,前后端分离架构变得越来越流行。这种架构意味着前端使用一种技术栈(如...通过这些配置,可以有效解决前端Vue.js应用在访问后端资源时遇到的跨域问题,从而使得前后端分离的开发模式得以顺利进行。

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

    解决跨域问题需要在后端设置允许跨域的Header信息,以便浏览器可以接受跨域请求。 在SpringBoot中,可以通过Filter机制来设置跨域的Header信息。下面是一个示例代码: ```java package com.rtpksps.kss.config; ...

    php版 解决跨域问题CORS ajax+get,post+jsonp例子源代码.zip

    JSONP(JSON with Padding)是另一种解决跨域的古老方法,尤其适用于不支持CORS的老旧浏览器。JSONP的基本原理是利用`<script>`标签不受同源策略限制的特性,通过动态创建`<script>`标签来请求数据。服务器返回的...

    springboot实现前后端分离项目

    本项目基于Spring Boot实现了后端接口,并结合Vue.js进行前端展示,同时利用axios处理跨域问题,提供了一个完整的前后端分离实践示例。 1. **Spring Boot**: Spring Boot是Spring框架的一个简化版,它简化了...

    Springboot前后端分离项目配置跨域实现过程解析

    为了解决跨域问题,我们可以使用CORS(Cross-Origin Resource Sharing)机制。CORS是一个W3C标准,允许服务器声明哪些源可以访问其资源。通过在后端配置CORS,我们可以允许指定的域名或端口访问我们的资源。 在...

Global site tag (gtag.js) - Google Analytics