0


Nginx学习笔记(六)Nginx实现跨域(cors)访问(2种方案)

本文将基于windows,使用Nginx实现跨域访问功能。

注:本文基于前述基础知识,如需要查看,请点这里

1.什么是跨域访问?

协议、域名、子域名、端口至少有一个不一样,则是不同域,否则是同域。示例如下:
(1)http://www.gupao.comhttps://www.gupao.com 不同域,协议不同
(2)http://www.gupao.comhttp://www.gupao.net 不同域,域名不同
(3)http://gper.gupao.comhttp://bbs.gupao.com 不同域,子域名不同
(4)http://www.gupao.com:2673http://www.gupao.com:2674 不同域,端口不同
(5)http://www.gupao.com/indexhttp://www.gupao.com/bbs 同域

2.浏览器同源策略

当我们在浏览器里访问一个域,不允许它跟另一个域的脚本进行交互。
主要是基于安全考虑,不允许web端同时访问不同的域(服务端)。

3.通过Nginx代理实现跨域访问(方法一)

原理:使用nginx同时代理 server1和server2,则对于浏览器来说,它只访问了一个地址(nginx服务器的地址),会认为是同一个域,从而实现跨域访问。
(1)nginx.conf配置如下:

server{
    listen 8060;
    server_name localhost;
    
    当访问/user/csrf 时,去到8062端口
    location /user/csrf {
        proxy_pass http://localhost:8062;
    }
    非访问/user/csrf 时,去到8061端口
    location / {
        proxy_pass http://localhost:8061;
    }
}

说明:修改配置后,需要执行 nginx -s reload

(2)csrf.html 示例如下(本示例基于thymeleaf):

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8"/>
    <title>this is the csrf file</title>
    <link rel="icon" href="https://www.gupaoedu.cn/favorite.ico"/>
    <script src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
</head>
<script type="text/javascript">
    $(document).ready(function(){
        console.log("here")
        $.ajax({
            url:"http://localhost:8060/user/100",
            type:"GET",
            success:function(data){

                alert("success!!跨域成功!");
            },
            error:function(){
                alert("fail!!!跨域失败!");
            }
        });
    })
</script>
<body>

</body>

</html>

(3)controller示例如下:

package com.imooc.web.controller;

import com.fasterxml.jackson.annotation.JsonView;
import com.imooc.dto.User;
import com.sun.javafx.UnmodifiableArrayList;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import sun.misc.Request;

import javax.jws.soap.SOAPBinding;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

@RestController
@RequestMapping("/user")
public class UserController {

    
    /**
     * @author linkang
     * @time 2022-09-28
     * @desc 获取用户信息
     * @param id 用户id
     */
    @RequestMapping(value = "/{id}",method = RequestMethod.GET)
    @JsonView(User.userSimpleView.class)
    public User getInfo(@PathVariable String id ){
        User user =new User();
        user.setUsername(id+"-"+Math.random());
        user.setPassword("1234");
        System.out.println("##############here:"+id);
        return user;
    }

  
    /**
     * @author linkang
     * @time 2022-09-28
     * @desc csrf跨域访问示例
     *
     */
    @RequestMapping("/csrf")
    public ModelAndView getCsrf(){
        return new ModelAndView("csrf");
    }

}

(4)启动模拟服务器并验证

通过修改springboot工程的application.properties的server.port,分别启动8061、8062模拟两台服务器,并分别测试验证下述网址能正常打开:

http://localhost:8061\user\100

http://localhost:8062\user\100

(5)验证nginx配置

使用浏览器打开下述地址,如果正常访问,表示配置正确:

http://localhost:8060/user/csrf

4.通过Nginx代理实现跨域访问(方法二)

原理:通过使用Nginx代理ajax访问的目标服务器时,在header中添加'Access-Control-Allow-Origin' http://localhost:8062、'Access-Control-Allow-Credentials' true 等信息,使浏览器认为该目标服务器(8061)允许指定服务器(8062)跨域访问,从而放行。
(1)nginx.conf配置如下:

server{
    listen 8060;
    server_name localhost; 
    
    location / {
        add_header 'Access-Control-Allow-Origin' http://localhost:8062;
        add_header 'Access-Control-Allow-Credentials' true;
        add_header 'Access-Control-Allow-Headers' *;
        add_header 'Access-Control-Allow-Methods' *;
        add_header 'Access-Control-Expose-Headers' *; 
        
        proxy_pass http://localhost:8061;
    }
}

(2)csrf.html 写法如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8"/>
    <title>this is the csrf file</title>
    <link rel="icon" href="https://www.gupaoedu.cn/favorite.ico"/>
    <script src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
</head>
<script type="text/javascript">
    $(document).ready(function(){
        console.log("here")
        $.ajax({
            url:"http://localhost:8060/user/100",
            type:"GET",
            success:function(data){

                alert("success!!跨域成功!");
            },
            error:function(){
                alert("fail!!!跨域失败!");
            }
        });
    })
</script>
<body>

</body>

</html>

(3)controller示例如下:

package com.imooc.web.controller;

import com.fasterxml.jackson.annotation.JsonView;
import com.imooc.dto.User;
import com.sun.javafx.UnmodifiableArrayList;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import sun.misc.Request;

import javax.jws.soap.SOAPBinding;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

@RestController
@RequestMapping("/user")
public class UserController {

    
    /**
     * @author linkang
     * @time 2022-09-28
     * @desc 获取用户信息
     * @param id 用户id
     */
    @RequestMapping(value = "/{id}",method = RequestMethod.GET)
    @JsonView(User.userSimpleView.class)
    public User getInfo(@PathVariable String id ){
        User user =new User();
        user.setUsername(id+"-"+Math.random());
        user.setPassword("1234");
        System.out.println("##############here:"+id);
        return user;
    }

  
    /**
     * @author linkang
     * @time 2022-09-28
     * @desc csrf跨域访问示例
     *
     */
    @RequestMapping("/csrf")
    public ModelAndView getCsrf(){
        return new ModelAndView("csrf");
    }

}
标签: nginx 学习 服务器

本文转载自: https://blog.csdn.net/nuaa042216/article/details/127190051
版权归原作者 xiaokang2216 所有, 如有侵权,请联系我们删除。

“Nginx学习笔记(六)Nginx实现跨域(cors)访问(2种方案)”的评论:

还没有评论