• 解决跨越的几种方式


    跨域请求

    的定义:协议 + 域名 + 端口
    三者完全相同则为同域,反之有其一不同均为不同域,
    当前发起请求请求指向 属于不同域时,该次请求称之为跨域请求。

    1. A应用只能访问 A 应用后台传来数据,B 应用只能访问 B 应用后台传来的数据;
    2. 如果 A 应用用 Ajax 获取数据时的 URL 地址中的协议、端口、域名其中有一个和 B 应用对应的话,则是 A 应用跨域获取 B 应用数据,是不允许的。

    同源策略

    同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。

    1. 同源策略会阻止一个域的javascript脚本和另外一个域的内容进行交互。
    2. 所谓同源(即指在同一个域)就是两个页面具有相同的协议(protocol),主机(host)和端口号(port)

    跨域的几种情况

    • 同一域名下允许通信(未指定端口协议)
    • 同一域名下不同文件夹允许通信
    • 同一域名不同端口不允许通信
    • 同一域名不同协议不允许通信
    • 域名和域名对应IP不允许通信
    • 主域名相同,子域名不同不允许通信
    • 同一域名,不同二级域名不允许通信
    • 不同域名不允许通信
    当前页面 URL被请求URL是否跨越原因
    http://www.baidu.comhttp://www.baidu.com/java.html同源(协议,域名,端口均相同)
    http://www.baidu.comhttps://www.baidu.com/java.html跨越协议不同(http,https)
    http://www.baidu.comhttp://www.google.com跨越主域名不同(baidu,google)
    http://www.baidu.comhttp://zhidao.baidu.com跨越子域名不同(www,zhidao)
    http://www.baidu.com:8080http://www.baidu.com:90跨越端口不同(80,90))

    1. 定义 CorsFilter (全局跨域)

    在配置类中,返回一个 新的 CorsFIlter Bean ,并添加映射路径和具体的CORS配置路径。

    @Configuration
    public class GlobalCorsConfig {
        @Bean
        public CorsFilter corsFilter() {
            //1. 添加 CORS配置信息
            CorsConfiguration config = new CorsConfiguration();
            //放行哪些原始域
            config.addAllowedOrigin("*");
            //是否发送 Cookie
            config.setAllowCredentials(true);
            //放行哪些请求方式
            config.addAllowedMethod("*");
            //放行哪些原始请求头部信息
            config.addAllowedHeader("*");
            //暴露哪些头部信息
            config.addExposedHeader("*");
            //2. 添加映射路径
            UrlBasedCorsConfigurationSource corsConfigurationSource = new UrlBasedCorsConfigurationSource();
            corsConfigurationSource.registerCorsConfiguration("/**",config);
            //3. 返回新的CorsFilter
            return new CorsFilter(corsConfigurationSource);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    2. 重写 WebMvcConfigurer (全局跨域)

    @Configuration
    public class CorsConfig implements WebMvcConfigurer {
        @Override
        public void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/**")
                    //是否发送Cookie
                    .allowCredentials(true)
                    //放行哪些原始域
                    .allowedOrigins("*")
                    .allowedMethods(new String[]{"GET", "POST", "PUT", "DELETE"})
                    .allowedHeaders("*")
                    .exposedHeaders("*");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    3. 使用自定义 Filter (全局跨域)

    import org.springframework.context.annotation.Configuration;
    import javax.servlet.*;
    import javax.servlet.annotation.WebFilter;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    @WebFilter(filterName = "CorsFilter ")
    @Configuration
    public class CorsFilter implements Filter {
        @Override
        public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
            HttpServletResponse response = (HttpServletResponse) res;
            response.setHeader("Access-Control-Allow-Origin","*");
            response.setHeader("Access-Control-Allow-Credentials", "true");
            response.setHeader("Access-Control-Allow-Methods", "POST, GET, PATCH, DELETE, PUT");
            response.setHeader("Access-Control-Max-Age", "3600");
            response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
            chain.doFilter(req, res);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    4. 使用注解 (局部跨域)

    在 crontaller 类或者方法上使用注解 @CrossOrigin 表示该类的所有方法允许跨域。

    # 在类上面设置
    @RestController
    @CrossOrigin(origins = "*")
    public class HelloController {
        @RequestMapping("/hello")
        public String hello() {
            return "hello world";
        }
    }
    
    
    
    # 在方法上面设置
    @RequestMapping("/hello")
    @CrossOrigin(origins = "*")
    //@CrossOrigin(value = "http://localhost:8081") //指定具体ip允许跨域
    public String hello() {
        return "hello world";
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
  • 相关阅读:
    VSCode安装与使用详细教程
    基于共生生物算法优化概率神经网络PNN的分类预测 - 附代码
    JS | “鼠标跟随”案例以及“留言板”案例
    shell-运算符
    Android Studio Chipmunk Patch 2(android-studio-2021.2.1.16)下载地址
    Vitalik:Layer2 是以太坊社区文化的延伸
    Linux中apache服务安装与mysql安装
    全栈性能测试工具:RunnerGo
    C++系列十:C++函数
    c/c++基本语法逆向分析
  • 原文地址:https://blog.csdn.net/upstream480/article/details/127820849