JavaScript

超轻量级php框架startmvc

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

更新时间:2020-04-21 00:26:09 作者:startmvc
AJAX教程AJAX=AsynchronousJavaScriptandXML(异步的JavaScript和XML)。在应用时主要是创建XMLHttpRequest

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", "*"); 即可。

Ajax 跨域