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 相关文章推荐
jquery的颜色选择插件实例代码
Oct 02 Javascript
javascript 面向对象全新理练之继承与多态
Dec 03 Javascript
浅谈jQuery的offset()方法及示例分享
Jul 17 Javascript
jQuery Ajax页面局部加载方法汇总
Jun 02 Javascript
jquery注册文本框获取焦点清空,失去焦点赋值的简单实例
Sep 08 Javascript
angularjs利用directive实现移动端自定义软键盘的示例
Sep 20 Javascript
AngularJs中$cookies简单用法分析
May 30 Javascript
socket在egg中的使用实例代码详解
May 30 Javascript
微信小程序实现一张或多张图片上传(云开发)
Sep 25 Javascript
用js编写留言板
Mar 17 Javascript
微信小程序以7天为周期连续签到7天功能效果的示例代码
Aug 20 Javascript
基于vue与element实现创建试卷相关功能(实例代码)
Dec 07 Vue.js
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
一个简单的php实现的MySQL数据浏览器
2007/03/11 PHP
php筛选不存在的图片资源
2015/04/28 PHP
php实现文件预览功能
2017/05/23 PHP
laravel 配置路由 api和web定义的路由的区别详解
2019/09/03 PHP
向fckeditor编辑器插入指定代码的方法
2007/05/25 Javascript
Javascript &amp; DHTML 实例编程(教程)(三)初级实例篇1—上传文件控件实例
2007/06/02 Javascript
修改jQuery.Autocomplete插件 支持中文输入法 避免TAB、ENTER键失效、导致表单提交
2009/10/11 Javascript
使用JQuery进行跨域请求
2010/01/25 Javascript
javascript引用赋值(地址传值)用法实例
2015/01/13 Javascript
javascript实现的淘宝旅行通用日历组件用法实例
2015/08/03 Javascript
javascript自执行函数
2017/02/10 Javascript
详解VueJs前后端分离跨域问题
2017/05/24 Javascript
element-ui多文件上传的实现示例
2019/04/10 Javascript
js实现3D照片墙效果
2019/10/28 Javascript
0基础学习前端开发的一些建议
2020/07/14 Javascript
安装ElasticSearch搜索工具并配置Python驱动的方法
2015/12/22 Python
Python构造自定义方法来美化字典结构输出的示例
2016/06/16 Python
python安装PIL模块时Unable to find vcvarsall.bat错误的解决方法
2016/09/19 Python
python使用json序列化datetime类型实例解析
2018/02/11 Python
Python连接Oracle之环境配置、实例代码及报错解决方法详解
2020/02/11 Python
python unichr函数知识点总结
2020/12/16 Python
新西兰最大的在线设计师眼镜店:SmartBuyGlasses新西兰
2017/10/20 全球购物
日常奢侈品,轻松购物:Verishop
2019/08/20 全球购物
linux面试题参考答案(2)
2015/12/06 面试题
主要的Ajax框架都有什么
2013/11/14 面试题
医药大学生求职简历的自我评价
2013/10/17 职场文书
法学专业自我鉴定
2014/02/05 职场文书
护士见习期自我鉴定
2014/02/08 职场文书
《飞向蓝天的恐龙》教学反思
2014/04/09 职场文书
个人担保书格式范文
2014/05/12 职场文书
党员个人对照检查材料范文
2014/09/24 职场文书
党员发展大会主持词
2015/07/03 职场文书
《我要的是葫芦》教学反思
2016/02/18 职场文书
五年级作文之成长
2019/09/16 职场文书
读《茶花女》有感:山茶花的盛开与凋零
2020/01/17 职场文书
Python爬虫基础之简单说一下scrapy的框架结构
2021/06/26 Python