跨域问题来历于JavaScript的同源策略,即只有 和谈+本家儿机名+端标语 (如存在)不异,则许可彼此拜候,有一种分歧即不克不及拜候。也就是说JavaScript只能拜候和操作本身域下的资本,不克不及拜候和操作其他域下的资本。跨域问题是针对JS和ajax的,html自己没有跨域问题,好比a标签、script标签、甚至form标签(可以直接跨域发送数据并领受数据)等 。
JSONP(JSON with Padding)是JSON的一种“利用模式”,可用于解决本家儿流浏览器的跨域数据拜候的问题。因为同源策略,一般来说位于 server1.example.com 的网页无法与不是 server1.example.com的办事器沟通,而 HTML 的<script> 元素是一个破例。操纵 <script> 元素的这个开放策略,网页可以获得从其他来历动态发生的 JSON 资料,而这种利用模式就是所谓的 JSONP。用 JSONP 抓到的资料并不是 JSON,而是肆意的JavaScript,用 JavaScript 直译器执行而不是用 JSON 解析器解析。
第一种:建立一个springboot的项目。
1、 打开建立页面 选择File-new-project..
2、选择建立的项目为spring initializr 进入springboot项目建立步调(也可以选择类型java,建立一个通俗java项目)
3、输入项目名字,选择依靠web(按照项目需求选择,此次需要),选择存放目次-完当作(Finish)
第二种:建立一个简单的javaweb项目。
1、直接打开:https://jingyan.baidu.com/article/ff411625048acf12e482373a.html
2、或者百度搜刮:servlet类若何映射到url路径 百度经验
第一步:编写被挪用项目标controller。
1、需要集当作springmvc,springboot项目集当作web就包含springmvc,通俗的servlet需要:
PrintWriter w = response.getWriter();w.print(json);
2、端口默认8080
3、controller代码如下所示
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
@RestController
public class TestController {
@RequestMapping("/bean")
public String testJson(HttpServletRequest request,
HttpServletResponse response, Map paramMap) {
String callback = request.getParameter("callback");
String id = request.getParameter("id");
String name = request.getParameter("name");
String sex = request.getParameter("sex");
String json = "{'id':" + id + ",'name':'" + name + "','sex':'" + sex
+ "'}";
if (callback != null) {
json = callback + "(" + json + ")";
}
return json;
}
}
4、启动办事并测试:
http://localhost:8080/bean?id=2&name=张三&sex=男
第二步:挪用项目标筹办。
1、新建一个javaweb项目
2、在端标语设置为8020
3、编写跨域挪用代码,本家儿如果页面js的编写
第一种:原生的js实现跨域。
1、借助于原生javascript实现,具体代码如下所示:
window.onload = function () {
var script = document.createElement('script');
script.setAttribute("type","text/javascript");
script.src = 'http://localhost:8080/bean?callback=ajaxCallback&id=2&name=张三&sex=男';
document.body.appendChild(script);
}
function ajaxCallback(data) {
alert('response data: ' + JSON.stringify(data));
};
第二种:借助于jquery的getJSON实现。
具体代码如下所示:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>跨域测试</title>
<script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>
</head>
<body>
<script>
$.getJSON("http://localhost:8080/bean?callback=?", {id:2,name:'李四',sex:'男'},
function(data) {
alert(data.id+data.name+data.sex);
});
</script>
</body>
</html>
第三种:借助于jquery的ajax实现。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>跨域测试</title>
<script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>
</head>
<body>
<script>
$.ajax({
//设置请求类型
type:"get",
//请求超不时间
timeout:5000,
//设置请求地址
url: 'http://localhost:8080/bean',
//设置需要发送的数据
data: {id:2,name:'李四',sex:'男'},
//界说此请求为跨域请求
dataType: 'jsonp',
//界说回调函数
jsonpCallback:"callbackUser",
success: function (data) {
console.log("当作功");
},
error: function (data) {
console.log(data)
}
})
function callbackUser(data){
alert("id:"+data.id+" name:"+data.name+" sex:"+data.sex);
}
</script>
</body>
</html>
第四种:本家儿如果对三种的优化。
1、本家儿如果去除jsonpCallback属性,url中传callback=?界说默认挪用ajax的回调函数。要与后台代码对应(String callback = request.getParameter("callback");)
2、挪用项目页面如下所示:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>跨域测试</title>
<script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>
</head>
<body>
<script>
$.ajax({
//设置请求类型
type:"get",
//请求超不时间
timeout:5000,
//设置请求地址
url: 'http://localhost:8080/bean?callback=?',
//设置需要发送的数据
data: {id:2,name:'李四',sex:'男'},
//界说此请求为跨域请求
dataType: 'jsonp',
success: function (data) {
console.log("当作功");
alert("id:"+data.id+" name:"+data.name+" sex:"+data.sex);
},
error: function (data) {
console.log(data)
}
})
</script>
</body>
</html>
1、jsonp实现的体例就是借助于script标签的src属性获取数据,然后将数据作为参数传给函数,解析数据。这一点我们需要连系后台callback + "(" + json + ")"
可以看出一二。
2、跨域问题的解决方案除了jsonp体例外还有一种CORS,与jsonp分歧的是这是一种后台解决方案。
0 篇文章
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!