关于java:跨域实现

同域测试

剖析:
1.浏览器地址:http://manage.jt.com/test.html
2.ajax申请地址:ajax申请地址: http://manage.jt.com/test.json
论断:当浏览器地址与ajax申请的地址(协定://域名:端口)雷同时能够实现失常的业务调用。

<script type="text/javascript" src="http://manage.jt.com/js/jquery-easyui-1.4.1/jquery.min.js"></script>
    <!--引入类库之后,执行js代码-->
<script type="text/javascript">
    <!--让整个页面加载实现之后执行js-->
    $(function(){
        $.get("http://manage.jt.com/test.json",function(data){
            alert(data.name);
        })
    })
</script>

跨域测试

剖析:
1.浏览器地址:浏览器地址: http://www.jt.com/test.html
2.ajax申请地址:http://manage.jt.com/test.json
论断:
如果申请地址(协定://域名:端口)不雷同则导致申请调用失败。

浏览器-同源策略阐明

阐明: 浏览器规定 发动ajax时如果申请协定/域名/端口号如果3者有一个与以后的浏览器的地址不雷同时,则违反了同源策略的规定.则浏览器不予解析返回值.
跨域问题:违反了同源策略的规定就是跨域申请。

跨域的形式

1、JSONP跨域
2、cors跨域

JSONP跨域原理

1.利用javascript中的src属性实现跨域申请;
2.自定义回调函数function callback(xxxx);
3.将返回值后果进行非凡的格局封装 callback(json);
4.因为利用src属性进行调用,所以只能反对get申请类型。

封装返回值

hello({"id":"1","name":"tom"})

页面js编辑

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>测试JSON跨域问题</title>    
    <script type="text/javascript">
        /*JS是解释执行的语言  */
        /*定义回调函数  */
        function hello(data){
            alert(data.name);
        }
    </script>
    <!--该json始终保留到浏览器中期待调用,然而没有函数名称无奈调用  -->
    <script type="text/javascript" src="http://manage.jt.com/test.json"></script>
    <script type="text/javascript" src="http://manage.jt.com/js/jquery-easyui-1.4.1/jquery.min.js"></script>
</head>
<body>
    <h1>JS跨域问题</h1>
</body>
</html>

JSONP

JSONP(JSON with Padding)是JSON的一种“应用模式”,可用于解决支流浏览器的跨域数据拜访的问题。因为同源策略,一般来说位于 server1.example.com 的网页无奈与不是 server1.example.com的服务器沟通,而 HTML 的

JSONP优化

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSONP测试</title>
<script type="text/javascript" src="http://manage.jt.com/js/jquery-easyui-1.4.1/jquery.min.js"></script>
<script type="text/javascript">
    $(function(){
        alert("测试拜访开始!!!!!")
        $.ajax({
            url:"http://manage.jt.com/web/testJSONP",
            type:"get",                //jsonp只能反对get申请
            dataType:"jsonp",       //dataType示意返回值类型
            jsonp: "callback",    //指定参数名称
            jsonpCallback: "hello",  //指定回调函数名称
            success:function (data){   //data通过jQuery封装返回就是json串
                console.log(data);
            }
        });    
    })
</script>
</head>
<body>
    <h1>JSON跨域申请测试</h1>
</body>
</html>

编辑后端Controller

package com.jt.web.controller;

import com.jt.pojo.ItemDesc;
import com.jt.util.ObjectMapperUtil;
import jdk.nashorn.internal.runtime.regexp.JoniRegExp;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class JSONPController {

    /**
     * 实现JSONP跨域申请
     * url地址: http://manage.jt.com/web/testJSONP?callback=xxxxxx
     * 参数:    临时没有能够不接
     * 返回值:  callback(JSON);
     */
     @RequestMapping("/web/testJSONP")
     public String testJSONP(String callback){
         ItemDesc itemDesc = new ItemDesc();
         itemDesc.setItemId(1000L).setItemDesc("JSONP测试!!!");
         String json = ObjectMapperUtil.toJSON(itemDesc);
         return callback+"("+json+")";
     }

}

控制台输入

JSONPObject阐明

 @RequestMapping("/web/testJSONP")
    public JSONPObject testJSONP(String callback){
        ItemDesc itemDesc = new ItemDesc();
        itemDesc.setItemId(1000L).setItemDesc("JSONP测试!!!");
        return new JSONPObject(callback, itemDesc);
    }

cors跨域

cors调用原理

实现cors调用

在公共配置文件中增加cors配置

@Configuration //标识我是一个配置类
public class CorsConfig implements WebMvcConfigurer {
    //在后端  配置cors容许拜访的策略
 @Override
 public void addCorsMappings(CorsRegistry registry){
        registry.addMapping("/**")
                .allowedMethods("GET","POST")  //定义容许跨域的申请类型
 .allowedOrigins("*")    //任意网址都能够拜访
 .allowCredentials(true)  //是都容许携带cookie
 .maxAge(1800);          //设定申请长连贯超时工夫  (探针)
 }
}

cors调用响应头解析

cors跨域测试


JSON数据格式

对于跨域的总结

1.jsonp
jsonp实质利用javaScript中的src属性的get申请实现的跨域.
返回值必须通过非凡的格局封装.
2.cors
增加在响应头中信息.指定哪些服务器容许拜访.

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理