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表格分页实现代码
Sep 18 Javascript
jquery ready(fn)事件使用介绍
Aug 21 Javascript
原生js实现复制对象、扩展对象 类似jquery中的extend()方法
Aug 30 Javascript
jquery实现的美女拼图游戏实例
May 04 Javascript
在React框架中实现一些AngularJS中ng指令的例子
Mar 06 Javascript
基于jQuery Ajax实现上传文件
Mar 24 Javascript
jQuery ajax提交Form表单实例(附demo源码)
Apr 06 Javascript
简介BootStrap model弹出框的使用
Apr 27 Javascript
javascript 判断页面访问方式电脑或者移动端
Sep 19 Javascript
通过一个简单的例子学会vuex与模块化
Nov 22 Javascript
vue中v-for加载本地静态图片方法
Mar 03 Javascript
vue父子组件间引用之$parent、$children
May 20 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
php时区转换转换函数
2014/01/07 PHP
简单实用的PHP文本缓存类实例
2019/03/22 PHP
php扩展开发入门demo示例
2019/09/23 PHP
event.srcElement+表格应用
2006/08/29 Javascript
jquery ajax 同步异步的执行 return值不能取得的解决方案
2012/01/08 Javascript
jquery动画2.元素坐标动画效果(创建一个图片走廊)
2012/08/24 Javascript
javascript动态添加、修改、删除对象的属性与方法详解
2014/01/27 Javascript
js,jquery滚动/跳转页面到指定位置的实现思路
2014/06/03 Javascript
dedecms页面如何获取会员状态的实例代码
2016/03/15 Javascript
js实现自动图片轮播代码
2017/03/22 Javascript
React教程之Props验证的具体用法(Props Validation)
2017/09/04 Javascript
细说webpack源码之compile流程-入口函数run
2017/12/26 Javascript
详解js正则表达式验证时间格式xxxx-xx-xx形式
2018/02/09 Javascript
vue 项目打包通过命令修改 vue-router 模式 修改 API 接口前缀
2018/06/13 Javascript
spring+angular实现导出excel的实现代码
2019/02/27 Javascript
[06:37]2014DOTA2国际邀请赛 昔日王者渴望重回巅峰
2014/07/12 DOTA
[01:47]2018年度DOTA2最具人气解说-完美盛典
2018/12/16 DOTA
python模拟登录百度贴吧(百度贴吧登录)实例
2013/12/18 Python
python实现2014火车票查询代码分享
2014/01/10 Python
Windows中使用wxPython和py2exe开发Python的GUI程序的实例教程
2016/07/11 Python
python基于pyDes库实现des加密的方法
2017/04/29 Python
利用Anaconda简单安装scrapy框架的方法
2018/06/13 Python
Python全局变量与局部变量区别及用法分析
2018/09/03 Python
Python适配器模式代码实现解析
2019/08/02 Python
PyQt实现计数器的方法示例
2021/01/18 Python
html5菜单折纸效果
2014/04/22 HTML / CSS
The Beach People美国:澳洲海滨奢华品牌
2018/07/05 全球购物
英语系毕业生自荐信
2013/10/31 职场文书
大学第二课堂活动总结
2014/07/08 职场文书
退学证明范本3篇
2014/10/29 职场文书
创业的9条正确思考方式
2019/08/26 职场文书
喜迎建国70周年:有关爱国的名言名句
2019/09/24 职场文书
WordPress多语言翻译插件 - WPML使用教程
2021/04/01 PHP
python基于tkinter制作下班倒计时工具
2021/04/28 Python
dubbo集成zipkin获取Traceid的实现
2021/07/26 Java/Android
《辉夜大小姐想让我告白》第三季正式预告
2022/03/20 日漫