• 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

  • 相关阅读:
    Django入门
    外星人入侵完整版
    外星人入侵
    简单的socket通信
    购物车程序
    列表的使用&元组
    三目运算的使用&bytes类型转str类型
    hdu 2586 How far away ?
    hdu 1075 What Are You Talking About
    洛谷 P2292 [HNOI2004]L语言
  • 原文地址:https://www.cnblogs.com/david1216/p/11466123.html
Copyright © 2020-2023  润新知