Nginx前后端分离解决跨越

一、什么是跨域?

跨域指的是浏览器不能执行其它网站的脚本,它是由浏览器的同源策略造成的,是浏览器对JavaScript 施加的安全限制。

二、同源策略

根据百度百科 同源策略它是由 Netscape 提出的一个安全策略,它是浏览器最核心也是最基本的安全功能,如果缺少同源策略,则浏览器的正常功能可能都会受到影响,现在所有支持JavaScript的浏览器都会使用这个策略。

所谓同源指的是:协议、域名、端口号都相同,只要有一个不相同,那么都是非同源。
在这里插入图片描述

同源策略限制的情况:

1、Cookie、LocalStorage 和 IndexDB 无法读取

2、DOM 和 Js对象无法获得

3、AJAX 请求不能发送

注意:对于像 img、iframe、linked、script 等标签的 src 属性是特例,它们是可以访问非同源网站的资源的。

**

三、如何解决跨域

1、response 添加header。

2、JSONP 方式。

3、HttpClient 请求转发。

4、nginx 转发

5、其他更多…

具体解决方案可参考大神的文章:https://www.cnblogs.com/ysocean/p/9380551.html

四、nginx解决跨越

问题描述:使用nginx发布前端内容,使用tomcat发布后端内容,会出现跨越问题。

1、前端项目放在myhtml下,使用nginx发布该项目。

 server {
                        listen       8888;
                        server_name  localhost;
                        location / {
                        #静态服务器
                            root   /Users/David/myhtml;
                            index  index.html index.htm;
                        } }

2、后端项目使用tomcat发布,tomcat端口号为8080。

 @RestController
 public class UserController {

 @Autowired
 UserService userService;

 @RequestMapping("/get")
 public List<User> getUserByPage(int pageSize, int pageNum){
 List<User> userList = userService.getAllUser();
    return userList;
}

}

3、前端页面show.html访问后端ajax代码:

$.ajax({
     url: "http://localhost:8080/get",
     type: "post",
     dataType: "json",
     success: function (data) {
     console.log(data);
     }
});

此时数据无法发正常获取,因为违反了同源策略。

解决方案:使用nginx代理tomcat容器,定义html访问规则和tomcat转发规则,实现html内容和tomcat内容都由nginx代理。解决跨域问题。

1、前端项目放在myhtml下,使用nginx发布该项目,定义访问规则。

#静态服务器
location ~.(html|js|css) {
root /Users/David/myhtml;
index index.html index.htm;
}
2、后端项目使用tomcat发布,tomcat端口号为8080,代码不做修改。

@RestController
public class UserController {
@Autowired
UserService userService;

@RequestMapping("/get")
public List<User> getUserByPage(int pageSize, int pageNum){
    List<User> userList = userService.getAllUser();
    return userList;
}

}

3、添加nginx代理tomcat服务代码,此时访问:http://localhost:8888 可以转发到:http://localhost:8080

  location / {
  #反向代理
  proxy_pass http://localhost:8080;
  }

4、前端ajax代码不做修改,可以简写"/get"。

$.ajax({
     url: "http://localhost:8888/get",
     type: "post",
     dataType: "json",
     success: function (data) {
     console.log(data);
     }
});

此时可以正常访问数据。

nginx核心配置:

server {
listen       8888;
server_name  localhost;
#静态服务器
location ~.(html|js|css) {
    root   /Users/David/myhtml;
    index  index.html index.htm;
}
 #反向代理tomcat
 location / {
    proxy_pass http://localhost:8080;
}
}

解析:

前端页面的访问地址为:http://localhost:8888/show.html(所有.html都进行静态解析)

show.html页面中请求后端地址为:http://localhost:8888/get (此时不违反跨越提交的规范,同域正常提交请求。)

后端地址符合nginx转发规则,代理转发到地址:http://localhost:8080/get(可以正常取到数据)

五、负载均衡(额外篇)

http {
 include mime.types; default_type application/octet-stream; 
upstream ngixServers{
 server 192.168.10.11:8080; 
 server 192.168.10.12:9090; } 
 server {     
 listen 8888; server_name localhost;
     
 location / {
        root   html;
        index  index.html index.htm;
        proxy_pass http://ngixServers;  
    }
  // ...
 }

参考大神文章:

https://www.cnblogs.com/ysocean/p/9380551.html

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值