• (十三)


    协议, 域名, 端口, 有一个不同即为跨域.

    一般情况下, 跨域的请求会被浏览器拦截:

    创建服务端 NoCrossingOrigin.java: (服务器端口为: 8080)

    @RestController
    @RequestMapping("/noOrigin")
    public class NoCrossingOrigin {
    
        @RequestMapping("/test1")
        public String test1(HttpSession session){
            System.out.println("noOrigin被访问...");
            System.out.println(session.getId());
            return "You can! --noOrigin";
        }
    }

    创建客户端 test.html: (客户端端口为: 5500)

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>TestCrossingOrigin</title>
    
        <script src="/jquery-3.3.1.js"></script>
    </head>
    <body>
    
        访问没有添加跨域注解的handler:
        <input type="button" value="发送请求" onclick="test()">
    
        <script>
    
            function test(){
                console.log("发送test...");
                $.ajax({
                    method: "get",
                    url: "http://localhost:8080/noOrigin/test1",
                    success: function(res){
                        console.log(res)
                    }
                })
            }
        </script>
    </body>
    </html>

    访问结果:

     

     可以看到, 前端的请求成功发送到了服务器, 但服务器返回的数据却被浏览器拦截了, 所以同源策略其实是浏览器拦截了服务器返回的数据, 请求还是能发到服务器的


    如果要实现跨域请求, 则只需在服务端对该前端地址加白, 就能避免同源策略, 方法是在handler或controller前加上注解:

    @CrossOrigin("地址"), 即可, 以上面的 NoCrossingOrigin.java 为例, 对其添加注解: (注意 127.0.0.1 和 localhost 是不一样的)

    @RestController
    @RequestMapping("/noOrigin")
    @CrossOrigin("http://127.0.0.1:5500")
    public class NoCrossingOrigin {
    
        @RequestMapping("/test1")
        public String test1(HttpSession session){
            System.out.println("noOrigin被访问...");
            System.out.println(session.getId());
            return "You can! --noOrigin";
        }
    }

    再次访问:

     可以看到前端成功获取并展示了服务器返回的数据


    此外, 通过测试发现, 跨域的请求, 每次请求的 session 的 id 都是不一样的, 所以要实现跨域获取(共用) session, 此法还不能满足, 需进一步处理(先留个坑..)

     按照网上说的, 在 Ajax 中添加配置 

                    xhrFields: {
                        withCredentials: true                
                    },
    在 handler 中添加配置
        response.setHeader("Access-Control-Allow-Credentials", "true");
    仍然无效~
  • 相关阅读:
    java内部类案例
    java内部类之成员内部类之局部内部类
    java内部类之成员内部类之匿名内部类
    java静态内部类
    java内部类之成员内部类实例
    java内部类之成员内部类
    UDP和TCP的区别和联系
    SSM
    连接各种数据库
    JDBC数据库连接
  • 原文地址:https://www.cnblogs.com/Ryan368/p/14247451.html
Copyright © 2020-2023  润新知