关于跨域,和跨域问题的完整解决方案

简介: 关于跨域,和跨域问题的完整解决方案

概念

跨域:浏览器对javascript的同源策略的限制,同源策略/SOP(Same origin policy)是一种约定,由Netscape公司1995年引入浏览器,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,浏览器很容易受到XSS、CSRF等攻击。所谓的同源是指,域名、协议、端口均为相同。,即便两个不同的域名指向同一个ip地址,也非同源。

同源限制的行为有

  • Cookie、LocalStorage 和 IndexDB 无法读取
  • DOM 和 JS 对象无法获取
  • Ajax请求发送不出去

如下报错,即为跨域问题

跨域的原因

跨域原因 示例
域名不同 www.jd.com与www.taobao.com
域名相同,端口不同 www.jd.com:8080与www.jd.com:8081
二级域名不同 item.jd.com与miaosha.jd.com

http和https也属于跨域

为什么会有跨域问题

跨域不一定出现跨域问题,一个页面发起的ajax请求,只能是与当前页域名相同的路径,这能有效的组织跨站攻击

跨域问题的解决方案

前端

  • Jsonp
<script>
var script = document.createElement('script');
script.type = 'text/javascript';

// 传参并指定回调执行函数为onBack
script.src = 'http://www.....:8080/login?user=admin&callback=onBack';
document.head.appendChild(script);

// 回调执行函数
function onBack(res) {
    alert(JSON.stringify(res));
}
</script>

后端

  • CORS

增加配置类 TestCorsConfiguration.java

package com.test.gateway.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;

@Configuration
public class TestCorsConfiguration {

    @Bean
    public CorsFilter corsFilter(){
        //初始化配置对象
        CorsConfiguration configuration = new CorsConfiguration();
        //允许跨域的域名,如果要携带cookie,不能写*。*:代表所有域名都可以跨域访问

        configuration.addAllowedOrigin("http://manage.test.com");
        configuration.setAllowCredentials(true);//设置是否允许携带cookie
        configuration.addAllowedMethod("*");//代表所有的请求方法
        configuration.addAllowedHeader("*");//允许携带所有头信息


        //初始化cors配置源对象
        UrlBasedCorsConfigurationSource configurationSource =new UrlBasedCorsConfigurationSource();
        configurationSource.registerCorsConfiguration("/**",configuration);
        //返回实例,参数cors配置源对象
        return new CorsFilter(configurationSource);
    }
}

运维

  • nginx反向代理

因为比较简单,这里就不展示Nginx的解决方案了

小结

跨域未必会出现跨域问题,跨域的解决方案有很多,后端和前端都可以,我比较喜欢从后端解决这个问题呢,除了以上列出的方案还有其他的解决办法,一个问题有很多解决办法,从中找最优解吧。

目录
相关文章
|
前端开发
Layui 内置方法 - layer.load(加载层)
Layui 内置方法 - layer.load(加载层)
2883 0
|
移动开发 JavaScript 前端开发
使用 JavaScript 进行跨域请求
使用 JavaScript 进行跨域请求
411 1
|
9月前
|
网络协议 Linux 网络安全
CentOS防火墙管理:查询与配置开放端口的技巧
遵循以上步骤,CentOS系统管理员能够灵活地查询和管理系统端口的开放情况,并且能适用于大多数防火墙管理场合。务必在改变防火墙规则后认真审核和测试,以确保网络安全性与服务的正常运行。
1487 0
|
前端开发 JavaScript Java
java实现文件对比
基于java实现类似于svn的文件对比功能及效果,该对比适用于html,js,css,text等
java实现文件对比
|
JSON 自然语言处理 前端开发
WebSocket调试工具深度对比:Postman与Apipost功能实测解析
本文深入对比了Postman与Apipost两款WebSocket调试工具。作为实时通讯系统工程师,作者在开发智能客服系统时遇到了传统工具调试复杂、文档管理不便的问题。通过引入Apipost的智能连接池、消息分组管理和自动化文档生成等功能,实现了多环境自动切换、消息分类和接口文档自动生成,极大提升了调试效率和团队协作效果。最终,使用Apipost使接口调试时间减少40%,文档维护成本降低70%,跨团队沟通效率提升50%。
|
JavaScript API
【Vue 3】effectScope 究竟为何物?其运作机制如何?又能为我们化解哪些难题?
【Vue 3】effectScope 究竟为何物?其运作机制如何?又能为我们化解哪些难题?
|
监控 Java 微服务
使用Spring Boot构建微服务架构
使用Spring Boot构建微服务架构
|
应用服务中间件 Linux 网络安全
【Azure 应用服务】PHP应用部署在App Service for Linux环境中,上传文件大于1MB时,遇见了413 Request Entity Too Large 错误的解决方法
【Azure 应用服务】PHP应用部署在App Service for Linux环境中,上传文件大于1MB时,遇见了413 Request Entity Too Large 错误的解决方法
425 0
|
资源调度 JavaScript Windows
'vue-cli-service' 不是内部或外部命令,也不是可运行的程序问题解决
【5月更文挑战第7天】'vue-cli-service' 不是内部或外部命令,也不是可运行的程序问题解决
21538 3