在前后端没有进行分离开发的时候,一个web项目里面,因为在同一个com文件夹,前后端的交互,尤其是ajax的访问是在本域内,是不存在这种问题的。但是为了实现程序开发的高效率和分工合作,前后端分离开发,越来越成为流行趋势。更重要的是,前后端分离部署,更便利于对项目高并发、负载均衡等性能的调优。Nginx是近年比较流行的一个开源服务器,用于部署前端项目,非常容易上手。

其实ajax跨域访问的解决方式有很多,使用jsonp、后台添加过滤器、设置响应头等,今天专门分享,使用nginx代理转发的方法,也能解决跨域访问的问题。

比如在本地后台Tomcat容器下,启动你的后台服务,端口号是8080;如何让前端的ajax请求跨域访问到呢?

nginx 的conf文件夹下配置nginx.conf文件,例如:

server {
         listen       8088;
         server_name  localhost; 
#配置前端项目的地址
         location / {
             root D:/workspace/mysqlTest; 
             index index.html; 
         }

#下面配置Tomcat服务器的地址,服务程序会自动进行代理转发  
         location /helloboot {
             proxy_pass   http://ip:port;
         }  }

由上面的配置可以知道,nginx的监听端口号是8088,服务名是localhost,root 指向前端项目的路径 ,index指向前端项目访问的首页。配置完成后,启动nginx服务,通过localhost:8088可以访问到自己的前端项目。

此时,以前端某ajax请求为例:

function sel(){
var name = $("#uname").val();
       var password = $("#password").val();
   
         $.ajax({
         type:"post",
         url:"http://localhost:8088/helloboot/user/login",       
         data:{"name":name,"password":password},
         success:function(data){
console.log(data)
         },
         error:function(res){
             alert("失败");
              
          }
})
 }

详解url,url:"http://localhost:8088/helloboot/user/login",     helloboot是我后台服务的访问路径,即:server.context-path=/helloboot
当我的ajax访问localhost:8088/helloboot服务的时候,nginx首先会拦截到本服务下8088端口的请求,拦截到后,通过proxy_pass   http://ip:port;

配置,转发请求到指定的后台服务,ip是本机的ip地址,也可以是127.0.0.1,port就是自己后台启动的端口,即本例中8080端口。这样,ajax就能访问到跨域的后台服务了。

值得注意的是,当ajax的url配置为localhost:8080/helloboot/user/login是无法直接访问到后台的。F12控制台会报错:

No 'Access-Control-Allow-Origin' header is present on the requested resource.即无法响应跨域访问。

要将ajax请求的url的端口号改为nginx的端口号:8088,只有这样,nginx才能拦截到来自8088的请求,继而进行代理转发服务了。

至此,实现分离开发模式下,ajax的跨域访问。