response.setHeader("Access-Control-Allow-Origin","*");//允许跨域访问
response.setHeader("Access-Control-Allow-Origin","www.baidu.com");//允许指定域名跨域访问
$.ajax({
type:"post",
url:"http://127.0.0.1:8888/ajax",
async:true,
data:{
name:"wangming",
age:"18"
},
dataType:"json",
//jsonp:"callback",
timeout:3000,//设置超时时间
success:function(data){
console.log(data.id)
console.log(data)
sendCycle();
},
error:function(data){
console.log("<<<<)
sendCycle();
}
});
----------------------------------------
window.onload = function sendCycle(){
//obj.toJSONString(); 对象转json串
$.ajax({
type:"post",
url:"http://127.0.0.1:8888/ajax",
async:true,
data:{
name:"wangming",
age:"18"
},
dataType:"jsonp",
jsonp:"callback",
timeout:3000,//设置超时时间
success:function(data){
console.log(data.id)
console.log(data)
sendCycle();
},
error:function(data){
console.log("<<<<)
sendCycle();
}
});
}
// 后端需要 拼接相应的数据 及 回调方法名
/**
* AJAX 跨域请求回调处理方法。
* @param callback 回调函数名字
* @param targetObj 返回对象
* @return json 格式字符串
*/
public static String getObjectJsonString( String callback, Object targetObj )
{
String objJsonString = null;
try {
objJsonString = objectMapper.writeValueAsString( targetObj );
} catch (JsonProcessingException e) {
LOGGER.info( "object translate to jsonString failed object is :{0}",targetObj,e );
}
return callback + "(" + objJsonString + ")";
}
//jsonp ajax 长连接轮询
window.onload = function sendCycle(){
//obj.toJSONString(); 对象转json串
$.ajax({
type:"post",
url:"http://127.0.0.1:8888/ajax",
async:true,
data:{
name:"wangming",
age:"18"
},
dataType:"json",
//jsonp:"callback",
timeout:3000,//设置超时时间
success:function(data){
console.log(data.id)
console.log(data)
sendCycle();
},
error:function(data){
console.log("<<<<)
sendCycle();
}
});
}
@RequestMapping(value = "ajax",produces = "application/json;charset=UTF-8")
@ResponseBody
public Object ajaxCycle( HttpServletResponse response ) throws JsonProcessingException
{
response.setHeader("Access-Control-Allow-Origin","*");//允许跨域访问
Map<String,Object> map = new HashMap<>();
map.put("success",1);
map.put("message",UUID.randomUUID());
System.err.println( UUID.randomUUID() );
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//return objectMapper.writeValueAsString(map);
return map;
}
setInterval(sendCycle(),3000);
//window.onload = function sendCycle(){
function sendCycle(){
//obj.toJSONString(); 对象转json串
$.ajax({
type:"post",
url:"http://127.0.0.1:8888/ajax",
async:true,
data:{
name:"wangming",
age:"18"
},
dataType:"json",
//jsonp:"callback",
timeout:3000,//设置超时时间
success:function(data){
console.log(data.id)
console.log(data)
sendCycle();
},
error:function(data){
console.log("<<<<)
sendCycle();
}
});
}
http 协议是请求/响应范式的,每个 http 响应都对应一个 http 请求,http 协议是无状态的,多个 http 请求之间相互隔离没有关联;
HTTP协议的被动性:
在标准的HTTP请求响应语义中,浏览器发起请求,服务器发送一个响应,这意味着在浏览器发起新请求前,服务器不能发送新信息给客户端浏览器;
缺点:消息交互的实时性较低(server端到浏览器端的数据反馈效率低);
server 没有数据到达时,HTTP 连接会停留一段时间,这会造成服务器资源浪费;
Server-Sent是HTML5提出一个标准。由客户端发起与服务器之间创建TCP连接,然后并维持这个连接,直到客户端或服务器中的任何一方断开,ServerSent使用的是"问"+"答"的机制,连接创建后浏览器会周期性地发送消息至服务器询问,是否有自己的消息。
特点 客户端只需连接一次,Server就定时推送,除非其中一端断开连接。并且SSE会在连接意外断开时自动重连。
缺点:并没有达到最新消息服务器端的实时推送。
window.onload = function () {
//双不等号,可以避免为空值的判断
if (!!window.EventSource) {
var source = new EventSource("message/get");//请求路径
//收到服务器消息
source.onmessage = function (evt) {
var data = evt.data;
var arr = data.split(",");
$.each(arr, function (i, item) {
showText(i, item);
})
}
//建立连接
source.onopen = function (evt) {
console.log(evt)
console.log("server connect successed")
}
//发送错误
source.onerror = function (evt) {
console.log(evt)
console.log("服务器内部错误")
}
} else {
console.log("你的浏览器不支持sse ")
}
}
//更新信息
function showText(i, item) {
$("#message").html(i + item);
}
HTML5标准中的一项内容,要求浏览器可以通过JavaScript脚本手动创建一个TCP连接与服务端进行通讯。WebSocket使用了ws和wss协议,需要服务器有与之握手的算法才能将连接打开。即可以满足"问"+"答"的响应机制,也可以实现主动推送的功能。
特点: 省流量,客户端什么时候想发就发,服务器端什么时候想回就回,两边都有监听者socket在负责。可以实现服务端消息的实时推送。