ajax 跨域 完全详解

本文深入探讨了基于前后端分离项目的跨域问题,包括发生原因、安全机制及解决策略。覆盖JSONP、自定义Filter、Nginx与Apache配置、预检请求处理,以及Spring框架的@CrossOrigin注解应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基于前后端分离的项目是大势所趋,避免不了跨域
问什么会发生ajax跨域安全:【三个请求同时满足才可能发生跨域安全问题】
1.浏览器安全限制,请求正常发送并返回,浏览器处理对请求的校验
解决方案: 要求浏览器禁止检查,命令参数方式启动浏览器 eg:chrome.exe --disable-web-security --user-data-dir=d:\temp3

2.跨域,请求发生的协议,域名,端口不一致
解决方案:JSONP请求方式;appending,动态创建script标签方式请求,但是不满足前后端开发需求,需要后台改动,且只支持GET请求.
    增加AbstractJsonpResponseBodyAdvice自定义类(使用方式自己另外百度),
    默认构造器里增加super("callback");callback默认前后台约定,可以更改

请求url是callback=jQuery.....=_时间戳,请求返回的数据是jquery函数调用式,最后一个参数是防止请求被缓存了,若请求时候加cache:true则无此参数
返回的数据类型是application/javascript,而普通请求返回是application/json,动态创建动态销毁,可通过debug模式查看脚本的创建和销毁

3.XHR(XMLHttpRequest)请求方式,其他请求方式,浏览器不会做跨域限制
解决方案:
    3.1被调用方(http协议增加响应头字段:)
        3.1.1服务器端实现:浏览器先执行后判断?,跨域判断方法,request请求头中增加了Origin信息
            增加Filter 自定义类配置url拦截规则,在dofilter方法里增加response响应头(FilterRegistrationBean)

            Access-Control-Allow-Origin:request.getHeader("Origin") 一般都是request里多了哪些请求头就加哪些
               * 不能满足带cookie的跨域
            Access-Control-Allow-Credentials:true  允许cookie跨域请求
            Access-Control-Allow-Methods:GET,POST,PUT等
            Access-Control-Allow-Headers:Content-Type等 带自定义头请求,
                自适应request.getHeader("Access-Control-Allow-Headers")
            Access-Control-Max-Age:秒  浏览器预检命令缓存时间

            简单请求:Content-Type为以下三种:text/plain;multipart/form-data;application/x-www-form-urlencoded
            非简单请求:常见的有put,delete方法的ajax请求;
            发送json格式,post方法用@RequestBody接受请求;

            带cookie的请求xhrFields:{ withCredentials:true }
            document.cookie='cookie1=test' 加在被调用方的域名下
            
        3.1.2NGIXN配置:
            虚拟主机:多个域名指向同一个服务器,服务器根据不同域名把请求转到不同服务器,实际只有一个主机
            增加HOSTS域名:127.0.0.1 被调用方域名,多个eg:a.com
            nginx/conf下新建vhost目录,打开nginx.conf倒数最后大括号前增加include vhost/*.conf;载入自定义配置文件
            vhost/a.conf新建内容:
            server{
                listen:80;
                server_name a.com;
                
                location /{
                    proxy_pass http://localhost:8080/; //所有请求都转发到8080服务器
                    add_header Access-Control-Allow-Origin $http_origin;
                    add_header Access-Control-Allow-Methods *;
                    add_header Access-Control-Allow-Credentials true;
                    add_header Access-Control-Allow-Headers $http_access_control_request_headers;
                    //预检命令处理[if带空格]
                    if ($request_method = OPTIONS){
                        return 200;
                    }
                }
            }
            nginx.exe -t测试配置文件是否正确
            start nginx.exe启动
            nginx.exe -s reload配置重新加载
            nginx.exe -s stop 停止nginx
        3.1.3APACHE配置
            apache/conf/httpd.conf  mod_vhost_alias.so模块打开,httpd-vhosts.conf配置文件项打开
                打开代理Proxy-140 mod_proxy.so打开 Proxy-149 mod_proxy_http.so打开
                打开请求头:mod_headers.so打开 mod_rewrite.so打开
            apache/conf/extra/httpd-vhosts.conf虚拟主机配置文件 
                新增最后一节点,ServerName改成eg:a.com; ProxyPass / http://locahost:8080/  其他日志可以改下
                


            启动apache/bin/httpd.exe
        3.1.4 Spring 增加@CrossOrigin注解
        
    3.2调用方
        隐藏跨域
        反向代理 配置nginx
        增加文件b.conf
        server{
            listen 80;
            server_name b.com;
            location /{
                proxy_pass http://locahost:8081/;
            }
            //服务器代理地址
            location /ajaxserver{
                proxy_pass http://locahost:8080/test;
            }
        }
        a.com域名下的/ajaxserver请求被代理到http://locahost:8080/test,而/被代理到8081正确的域名服务器下
        
        Apache代理同nginx差不多
 

备注:参照慕课网ajax跨域完全详解,如有问题还请多多留言,谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值