跨域的三种实现方式

一.跨域
  由于浏览器同源策略,凡是发送请求url的协议、域名、端口三者之间任意一个与当前页面地址不同即为跨域
  前页面地址与发送请求的url的协议、域名、端口三者之间任意一个地址不同,既为跨域,哪怕不同域名指向的同一地址,也是跨域。

二.方案

1.script标签加载

browser:html>js

document.getElementById("btn").onclick=function(){
    var str=$('<script type="text/javascript" src="http://127.0.0.1:8080/testJsonp/test.jsp?name=fun">');
    $(document).append(str);
}

Server:jsp

<%
String name=request.getParameter("name");
String html="\'<div id=\"gg\" name=\"ggb\" style=\"color:red\">fdsfdsfd</div>\'";
out.print(“$(document.body).append(”+html+“)”);//自动在body添加html
%>

或者在html定义方法,在jsp调用方法,并传参

2.Ajax的Jsonp,自动解析json为js对象(底层还是通过script标签)
browser:html>jq

$.ajax("http://127.0.0.1:8080/testJsonp/test.jsp",{
        dataType:'jsonp',
        jsonp:'funName',
        error:function(xhr,errMes,errObj){
            alert(errMes);
        },
        success:function(data){//jQuery18309719266761046812_1484988035397({name:'xiaoming',age:20})
            alert(data.name);
        }
});

Server:jsp

<%
String name=request.getParameter("funName");
name+="({name:\'xiaoming\',age:20})";
out.print(name);
%>

3.CORS简单请求
在想跨域的服务器中添加:

response.setHeader("Access-Control-Allow-Origin", "http://client1.tiglle.com");

参数一:固定Access-Control-Allow-Origin
参数二:允许跨域访问的域名,或者ip
多个用”,”分隔。”*”代表所有域都能跨域,不安全:

response.setHeader("Access-Control-Allow-Origin", "http://client1.tiglle.com,http://client2.tiglle.com");
response.setHeader("Access-Control-Allow-Origin", "*");

4.CORS非简单请求
1.非简单请求会先请求发送OPTIONS请求验证
域a的jsp:

<script type="text/javascript">
    function launch(){
        $.ajax({
            url:'http://server.tiglle.com/server/corsServlet',
            method:'post',
            beforeSend:function(xhr){
                xhr.setRequestHeader("a","b");
            },
            success:function(){
                console.log(arguments[0]);
            }
        });
    }
  </script>

域b的服务器的servlet:

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setHeader("Access-Control-Allow-Origin", "http://client1.tiglle.com");
        response.getWriter().print("haha,ok le");

    }

    @Override
    protected void doOptions(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.addHeader("Access-Control-Allow-Origin", "*");
        response.addHeader("Access-Control-Allow-Methods", "GET,POST,OPTIONS,DELETE");
        response.addHeader("Access-Control-Allow-Headers", "a,b");

    }

三.通过nginx解决
页面地址和nginx监听地址一致,然后页面请求地址指向统一nginx,由nginx根据规则转发到不同服务器,然后通过nginx返回。

cors详见:http://www.ruanyifeng.com/blog/2016/04/cors.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值