1、使用jsonp方式

使用jsonp访问的话,前端需要把回调函数名传递给后端,后端执行完后也需要把回调函数传回给前端,默认情况下ajax自动生成一个回调函数名,后端可以通过String callback = request.getParameter("callback");  得到这个回调函数名

前端示范代码:

 $.ajax({
"type" : "post",
"dataType" : "jsonp",
"async" : false,
"url" : "http://192.168.0.24:8080/WaterMIS_App/data",
"data" : {
"action" : "checkAddress",
},
"success" : function(xhr) {
alert("成功!")
}
});

后端示范代码:

 public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
//请求
String action = request.getParameter("action");
//回调函数名
String callback = request.getParameter("callback");
//控制器部分
if("checkAddress".equals(action)){
response.setContentType("text/html;charset=utf-8");
response.getWriter().write(callback+"({});");
}
}

后端响应必须以functionName(JSON字符串);这样的字符串返回给前端。

改进:

jsonp类型的请求是只能异步的,而且请求失败也不会有任何的提示,因此我的解决办法是使用setTimeout推迟成功回调函数的执行,通过设置flag判断是否已经执行了成功回调而判断是否执行失败代码

前端示范代码改进:

 var flag = 1; //是否已经执行过回调函数 1为初始值 2为执行过 0为响应失败
var time = 1000;//时间设置 单位.毫秒
$.ajax({
"timeout" : time,
"type" : "post",
"dataType" : "jsonp",
"async" : false,
"url" : "http://192.168.0.24:8080/WaterMIS_App/data",
"data" : {
"action" : "checkAddress",
},
"success" : function(xhr) {
flag = 2;
alert("成功!");
}
}); //请求失败 把方法设置为time毫秒之后执行 假如flag不为2 则在时间范围内成功回调没有执行,则认为请求失败
setTimeout(function() {
if (flag!=2) {
flag = 0;
alert("失败!");
}
}, time+1); //请求超时 当时间为time+2 flag还为初始时候的值1 则认为成功回调跟请求失败都没执行,则认为请求超时
setTimeout(function(xhr) {
if (flag==1) {
alert("超时");
}
}, time+2);

2、设置响应头的方式进行跨域请求

通过设置响应头,达到跟普通ajax请求一样的效果

前端示范代码:

 $.ajax({
"type" : "post",
"async" : false,
"dataType" : "json",
"url" : "http://192.168.0.24:8080/WaterMIS_App/data",
"data" : {
"action" : "checkAddress",
},
"complete" : function(xhr) {
if (xhr.readyState == 4 && xhr.status == 200) {
alert("成功!");
} else {
alert("失败!");
}
}
});

后端代码示范:

 public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
//请求
String action = request.getParameter("action"); //控制器部分
if("checkAddress".equals(action)){
response.setContentType("text/html;charset=utf-8");
((HttpServletResponse)response).addHeader("Access-Control-Allow-Origin", "*");
response.getWriter().write("{}");
}
}

备注:

第一种方法得到的json数据是自动解析成json对象的,能直接对json对象的操作

第二种方法得到的仅仅只是一个字符串,假如是一个json格式的字符串,可以通过eval()或者JSON.parse()进行转换,另外需要注意响应头再一次请求中只能被设置一次,多次设置会导致出错。最好是在过滤器中进行设置。

WEX5中ajax跨域访问的几种方式的更多相关文章

  1. System.Web.Http.Cors配置跨域访问的两种方式

    System.Web.Http.Cors配置跨域访问的两种方式 使用System.Web.Http.Cors配置跨域访问,众多大神已经发布了很多文章,我就不在详细描述了,作为小白我只说一下自己的使用心 ...

  2. ajax实现跨域访问的两种方式

    一.使用jsonp实现跨域请求 在前端开发这中你会发现,所有带src属性的标签都可以跨域访问其他服务器文件.jsonp实现的原理也是如此. 以jsonp的数据类型进行请求时,JQ会动态在页面中添加sc ...

  3. 解决Entity Framework查询匿名对象后的跨域访问的一种方式

    在Entity Framework中,可以使用lambda表达式进行对数据的查询,而且可以将查询结果直接映射为对象或者对象列表,这极大的提高的开发速度,并且使数据层的数据更加方便处理和传递.但是很多时 ...

  4. 【js跨域】js实现跨域访问的几种方式

    这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被 ...

  5. jQuery 跨域访问的三种方式 No 'Access-Control-Allow-Origin' header is present on the reque

    问题: XMLHttpRequest cannot load http://v.xxx.com. No 'Access-Control-Allow-Origin' header is present ...

  6. 在Firefox中通过AJAX跨域访问Web资源---

    一.解决在firefox中无法跨域访问的问题 AJAX从本质上讲就是命名用XMLHttpRequest组件来向服务端发送HTTP请求,请接收相应信息.至于成功接收到响应信息后的操作,就和普通的Web客 ...

  7. 浅析JSONP-解决Ajax跨域访问问题

    浅析JSONP-解决Ajax跨域访问问题 很久没有写随笔了,总是感觉没时间,其实时间就是...废话少说,前几天,工作上有一新需求,需要前端web页面异步调用后台的Webservice方法返回信息.实现 ...

  8. ajax跨域访问的解决方案

    今天的工作中要访问摄像机内部的一个web站点,这就涉及到jquery的ajax跨域访问的问题.我使用的是jquery1.7的版本,下面总结如下: 问题一:一开始用IE调试,总是返回No Transpo ...

  9. Ajax跨域访问解决办法

    方法1. jsonp实现ajax跨域访问示例 jsp代码: <body> <input type="button" onclick="testJsonp ...

随机推荐

  1. 转://Oracle PL/SQL 优化与调整 -- Bulk 说明

    一. Bulk 概述 本来只想测试一下Bulk Collect 和update性能的,但发现Bulk 的东西还是很多的,在OTN上搜了一些,整理如下. 1.1 Bulk Binding 和 Bulk ...

  2. IDEA+Maven+Tomcat构建项目流程

    0.准备 本文主要解决在IDEA上开发Maven-webapp项目关联Tomcat的问题. 首先,确保本地计算机下载解压了Tomcat压缩包,以及配置好了Java环境. 1.新建Mavne项目 2.I ...

  3. Sql 调优总结

    1前言 Sql 语句调优对应用性能非常重要,看了几篇文章,总结了一下数据库优化的方法. 2 数据库 Sql 优化 1 对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by ...

  4. 图片自适应完美兼容IE8

    <!DOCTYPE html><html lang="en"><head> <meta charset="gb2312" ...

  5. 语法设计——基于LL(1)文法的预测分析表法

    实验二.语法设计--基于LL(1)文法的预测分析表法 一.实验目的 通过实验教学,加深学生对所学的关于编译的理论知识的理解,增强学生对所学知识的综合应用能力,并通过实践达到对所学的知识进行验证.通过对 ...

  6. elasticsearch(6.2.3)安装Head插件

    一.安装elasticsearch,参照:https://www.cnblogs.com/dyh004/p/8872443.html 二.安装nodejs,参照:https://www.runoob. ...

  7. 使用git将项目上传到github

    使用git将项目上传到github(最简单方法)   首先你需要一个github账号,所有还没有的话先去注册吧! https://github.com/ 我们使用git需要先安装git工具,这里给出下 ...

  8. Python-正则复习-56

    # 正则表达式# 字符组 [字符]# 元字符 # \w \d \s # \W \D \S # . 除了换行符以外的任意字符 # \n \t # \b # ^ $ 匹配字符串的开始和结束 # () 分组 ...

  9. Python_每日习题_0006_斐波那契数列

    程序设计: 斐波那契数列(Fibonacci sequence),从1,1开始,后面的每一项等于前面两项之和. 图方便就递归实现,图性能就用循环. # for 循环 target = int(inpu ...

  10. H5 35-背景平铺属性

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...