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 相关文章推荐
JS实现拖动示例代码
Nov 01 Javascript
在Iframe中获取父窗口中表单的值(示例代码)
Nov 22 Javascript
jQuery实现行文字链接提示效果的方法
Mar 10 Javascript
JS实现仿FLASH效果的竖排导航代码
Sep 15 Javascript
Angularjs 依赖压缩及自定义过滤器写法
Feb 04 Javascript
ES6实现的遍历目录函数示例
Apr 07 Javascript
element-ui 的el-button组件中添加自定义颜色和图标的实现方法
Oct 26 Javascript
Next.js项目实战踩坑指南(笔记)
Nov 29 Javascript
jQuery实现的简单歌词滚动功能示例
Jan 07 jQuery
jQuery选择器之层次选择器用法实例分析
Feb 19 jQuery
vue项目中将element-ui table表格写成组件的实现代码
Jun 12 Javascript
layui 富文本编辑器和textarea值的相互传递方法
Sep 18 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
简单的过滤字符串中的HTML标记
2006/12/25 PHP
PHP程序员最常犯的11个MySQL错误小结
2010/11/20 PHP
php数据结构与算法(PHP描述) 快速排序 quick sort
2012/06/21 PHP
使用PHP Socket 编程模拟Http post和get请求
2014/11/25 PHP
手把手编写PHP框架 深入了解MVC运行流程
2016/09/19 PHP
网易JS面试题与Javascript词法作用域说明
2010/11/09 Javascript
JS验证邮箱格式是否正确的代码
2013/12/05 Javascript
jQuery的$.proxy()应用示例介绍
2014/04/03 Javascript
JavaScript判断变量是否为空的自定义函数分享
2015/01/31 Javascript
jquery实现多屏多图焦点图切换特效的方法
2015/05/04 Javascript
微信小程序教程系列之新建页面(4)
2017/04/17 Javascript
详解vue2.0的Element UI的表格table列时间戳格式化
2017/06/13 Javascript
详解ElementUI之表单验证、数据绑定、路由跳转
2017/06/21 Javascript
React-Native之定时器Timer的实现代码
2017/10/04 Javascript
微信小程序scroll-view组件实现滚动动画
2018/01/31 Javascript
JQuery通过键盘控制键盘按下与松开触发事件
2020/08/07 jQuery
JS轮播图的实现方法
2020/08/24 Javascript
js加减乘除精确运算方法实例代码
2021/01/17 Javascript
[05:09]第二届DOTA2亚洲邀请赛决赛日比赛集锦:iG 3:0 OG夺冠
2017/04/05 DOTA
Python列表(list)、字典(dict)、字符串(string)基本操作小结
2014/11/28 Python
pandas值替换方法
2018/07/10 Python
Python3中关于cookie的创建与保存
2018/10/21 Python
pandas计数 value_counts()的使用
2019/06/24 Python
python 协程中的迭代器,生成器原理及应用实例详解
2019/10/28 Python
python基于opencv 实现图像时钟
2021/01/04 Python
CSS3中HSL和HSLA的简单使用示例
2015/07/14 HTML / CSS
使用HTML5的Notification API制作web通知的教程
2015/05/08 HTML / CSS
巴西食品补充剂在线零售商:Músculos na Web
2017/08/07 全球购物
Vivo俄罗斯官方在线商店:中国智能手机品牌
2019/10/04 全球购物
网络工程师面试(三木通信技术有限公司)
2013/06/05 面试题
应届毕业生的自我鉴定
2013/11/13 职场文书
人力资源部培训专员岗位职责
2014/01/02 职场文书
毕业生自荐书模版
2014/01/04 职场文书
公务员培的训心得体会
2014/09/01 职场文书
幼儿园科学课教学反思
2016/03/03 职场文书
MySQL创建定时任务
2022/01/22 MySQL