Ajax跨域实现代码(后台jsp)


Posted in Javascript onJanuary 21, 2017

AJAX 教程

AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。

在应用时主要是创建XMLHttpRequest对象,调用指定服务地址。

但是IE中各个版本支持的不太一样,所以在创建次对象时可能要特殊处理下。

一般如下:

function createXMLHttpRequest(){
 var xmlhttp;
 try{
  xmlhttp = new XMLHttpRequest();//ie7及以上,其他浏览器
 }catch(e){
  try{
   xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");//ie6
  }catch(e){
   try{
    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");//ie6以下
   }catch(e){
    throw "创建AJAX对象失败!";
   }
  }
 }
 return xmlhttp;
 }


 var xmlhttp = createXMLHttpRequest();
  xmlhttp.open("GET","http://localhost:8080/SimpleBlog/AjaxTest",true);
  xmlhttp.send(null);
  xmlhttp.onreadystatechange = function(result){
  if(xmlhttp.readyState==4 && xmlhttp.status == 200){
   alter(result.test);
  }
 };

但是浏览器再执行javascript代码时,有个著名的同源策略,这使得跨域请求就不是那么方便了。

那一般都是用什么方式支持跨域呢?

1、通过中间代理服务器,获取要跨域请求的数据。

2、通过iframe内嵌带请求域的页面,来解决跨域访问问题。

3、通过jsonp方式。

4、不过现在已经提出了XMLHttpRequest Level2(XHR2)允许跨域请求,不过要在server的返回头中显示声明允许跨域请求(浏览器的支持情况:http://caniuse.com/#feat=xhr2)。

下面简单说下jsonp与xtr2。

jsonp:

jsonp简单的说就是利用<script>标签来实现跨域请求的调用,因为浏览器中脚本的加载是不受同源策略影响的。

function get() {
  var url = 'http://localhost:8080/SimpleBlog/AjaxTest?callback=callback';
  var script = document.createElement('script'); 
  script.setAttribute("type","text/javascript"); 
  script.src = url; 
  document.body.appendChild(script); 
 }
 
 function callback(va){
  alert(va.test);
 }

服务端(java):

boolean jsonP = false;
 String cb = this.request.getParameter("callback");
 if (cb != null) {
 jsonP = true;
 response.setContentType("text/javascript");
 } else {
  response.setContentType("application/x-json");
 }
 PrintWriter out = response.getWriter();
 if (jsonP) {
  try {
   out.println(cb + "({\"test\":\"1\"})");
   out.flush();
   out.close();
  } catch (Exception e) {
   throw e;
  }
 }

这样就可以实现跨域调用了。

而我们经常用的jquery已经实现了此类方式的封装,使用起来更简单。

$(document).ready(function (){
  $('#jqueryajax').bind('click', function(){
  $.ajax({
   type: 'get',
   async: false,
   url: 'http://localhost:8080/SimpleBlog/AjaxTest1',
   dataType: 'jsonp',
   jsonp: 'callback',
   success: function(json){
    alert(json.result);
   },
   error: function(){
    alert('fail');
   }
  });
  });
 });

服务端(java):
我用了struts是这样写的:

public class AjaxTest1 extends ActionSupport {

 private String result;
 public String getResult() {
  return result;
 }
 
 public String execute() {
 
  this.result = "1";
  return "jqueryajax";
 }
}

配置文件:

<action name="AjaxTest1" class="AjaxTest1">
 <result name="jqueryajax" type="json">
  <param name="callbackParameter">callback</param>
 </result>
 </action>

下面说说xtr2:

这个就更简单了,直接创建调用即可。

function createCORSRequest(method,url){
  var xhr=new XMLHttpRequest();
  if('withCredentials' in xhr){
  xhr.open(method,url,true);
  }else if(typeof XDomainRequest!='undefined'){
   xhr=new XDomainRequest(); 
   xhr.open(method,url);
  }else{
   xhr=null;
  }
  return xhr;
 }
 
 function xhr2(){
  var request=createCORSRequest('GET','http://localhost:8080/SimpleBlog/AjaxTest1');
  if(request){
  request.onload=function(){
   alert(request.responseText);
  }
  request.onerror=function(e){
   alert('error');
  }
  request.send();
  } 
 }

服务端:其实只要在返回response中设置
httpResponse.addHeader("Access-Control-Allow-Origin", "*");
即可。

Javascript 相关文章推荐
代码生成器 document.write()
Apr 15 Javascript
jquery 弹出层实现代码
Oct 30 Javascript
Javascript load Page,load css,load js实现代码
Mar 31 Javascript
理解JavaScript的prototype属性
Feb 11 Javascript
JavaScript在多浏览器下for循环的使用方法
Nov 07 Javascript
javascript用函数实现对象的方法
May 14 Javascript
JS随机调用指定函数的方法
Jul 01 Javascript
Node.js本地文件操作之文件拷贝与目录遍历的方法
Feb 16 Javascript
js实现右键自定义菜单
Dec 03 Javascript
修改node.js默认的npm安装目录实例
May 15 Javascript
详解使用React制作一个模态框
Mar 14 Javascript
解决vue字符串换行问题(绝对管用)
Aug 06 Javascript
JavaScript、C# URL编码、解码总结
Jan 21 #Javascript
Vue结合原生js实现自定义组件自动生成示例
Jan 21 #Javascript
jQuery基于正则表达式的表单验证功能示例
Jan 21 #Javascript
一篇文章搞定JavaScript类型转换(面试常见)
Jan 21 #Javascript
超全面的JavaScript开发规范(推荐)
Jan 21 #Javascript
Mongoose学习全面理解(推荐)
Jan 21 #Javascript
ng-options和ng-checked在表单中的高级运用(推荐)
Jan 21 #Javascript
You might like
中国的第一台收音机
2021/03/01 无线电
php获取文件大小的方法
2014/02/26 PHP
PHP获取文件行数的方法
2015/06/10 PHP
PHP abstract 抽象类定义与用法示例
2018/05/29 PHP
js如何判断用户是在PC端和还是移动端访问
2014/04/24 Javascript
JS图片自动轮换效果实现思路附截图
2014/04/30 Javascript
node.js中的fs.rmdir方法使用说明
2014/12/16 Javascript
DOM基础教程之使用DOM + Css
2015/01/20 Javascript
js立即执行函数: (function ( ){})( ) 与 (function ( ){}( )) 有什么区别?
2015/11/18 Javascript
原JS实现banner图的常用功能
2017/06/12 Javascript
客户端(vue框架)与服务器(koa框架)通信及服务器跨域配置详解
2017/08/26 Javascript
IntersectionObserver实现图片懒加载的示例
2017/09/29 Javascript
vue-router中scrollBehavior的巧妙用法
2018/07/09 Javascript
JS 自执行函数原理及用法
2019/08/05 Javascript
js实现点赞效果
2020/03/16 Javascript
详细分析vue表单数据的绑定
2020/07/20 Javascript
在antd4.0中Form使用initialValue操作
2020/11/02 Javascript
[47:46]完美世界DOTA2联赛 Magma vs GXR 第三场 11.07
2020/11/10 DOTA
python实现网页链接提取的方法分享
2014/02/25 Python
python使用7z解压apk包的方法
2015/04/18 Python
对python中的six.moves模块的下载函数urlretrieve详解
2018/12/19 Python
Python实现 PS 图像调整中的亮度调整
2019/06/28 Python
python pandas 时间日期的处理实现
2019/07/30 Python
python安装virtualenv虚拟环境步骤图文详解
2019/09/18 Python
css3实现文字扫光渐变动画效果的示例
2017/11/07 HTML / CSS
可能这些是你想要的H5软键盘兼容方案(小结)
2019/04/23 HTML / CSS
HTML如何让IMG自动适应DIV容器大小的实现方法
2020/02/25 HTML / CSS
QQ空间主人寄语大全
2014/04/12 职场文书
小学生期末评语大全
2014/04/21 职场文书
2014年小学教师工作自我评价
2014/09/22 职场文书
初三语文教学计划
2015/01/22 职场文书
商场圣诞节活动总结
2015/05/06 职场文书
中学生国庆节演讲稿2015
2015/07/30 职场文书
2016年安全生产先进个人事迹材料
2016/02/29 职场文书
nginx配置proxy_pass中url末尾带/与不带/的区别详解
2021/03/31 Servers
阿里云ECS云服务器快照的概念以及如何使用
2022/04/21 Servers