从其他域(jquery ajax)访问托管在 aws ec2 上的 rest 服务但出现 CORS 错误

Posted

技术标签:

【中文标题】从其他域(jquery ajax)访问托管在 aws ec2 上的 rest 服务但出现 CORS 错误【英文标题】:Accessing rest service hosted on aws ec2 from other domain (jquery ajax) but getting CORS error 【发布时间】:2016-05-09 04:34:27 【问题描述】:

我在网上找到了所有可能的解决方案,但无法解决我的问题。请高手帮忙。 问题:创建了一个 struts2 应用程序并托管在 Elastic beanstalk 上,其中一个类作为 Rest 服务公开。类如下

package com.xeon.adworld.restws;


import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.GET;
import javax.ws.rs.OPTIONS;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

import org.apache.log4j.Logger;

import com.xeon.adworld.hibernatepojos.Admaster;
import com.xeon.adworld.hibernatepojos.AdmasterDAO;
import com.xeon.adworld.hibernatepojos.Businessacc;
import com.xeon.adworld.hibernatepojos.BusinessaccDAO;
import com.xeon.adworld.hibernatepojos.Restservicehitinfo;
import com.xeon.adworld.hibernatepojos.RestservicehitinfoDAO;

@Path("FetchBusSer")
public class FetchBusAds 
static Logger log = Logger.getLogger(FetchBusAds.class);
@Context
  private HttpServletRequest request;

@Context
  private HttpServletResponse response;


//@GET
@OPTIONS
@Path("/fetchbusads")
@Produces(MediaType.APPLICATION_XML)
public Response fetchBusinessAds() 

    try
        String partnerId=(null!=request.getParameter("pid")?request.getParameter("pid").toLowerCase():"");
        String ip=(null!=request.getParameter("ip")?request.getParameter("ip").toLowerCase():"");

    BusinessaccDAO businessaccDAO=new BusinessaccDAO();
    List<Businessacc> busList=businessaccDAO.findByBusuuid(partnerId);
    if(busList.size()>0)

    AdmasterDAO admasterDAO=new AdmasterDAO();
    //PersonaladsDAO personaladsDAO = new PersonaladsDAO();
    List<Admaster> adsList= admasterDAO.getLatestAds();
    StringBuffer allAdsString = new StringBuffer(
    "<?xml version=\"1.0\" encoding=\"UTF-8\"?><main>");

    for (Admaster result : adsList) 
        allAdsString.append("<data>");
        allAdsString.append("<imgpath>"+result.getImagepath()+"</imgpath>");
        allAdsString.append("</data>");
    

    allAdsString.append("</main>");
    System.out.println("allAds : string 7ndst: " + allAdsString.toString());

    return Response.ok(allAdsString.toString()).header("Access-Control-Allow-Origin", "*").header("Access-Control-Allow-Methods", "GET, POST, PUT, UPDATE, OPTIONS").header("Access-Control-Allow-Headers", "Content-Type, Accept").build();
    else
        RestservicehitinfoDAO restservicehitinfoDAO=new RestservicehitinfoDAO();
        Restservicehitinfo restservicehitinfo = new Restservicehitinfo();
        restservicehitinfo.setIpaddress(ip);
        restservicehitinfo.setAdpartnerid(partnerId);
        restservicehitinfo.setVisitingdate(new java.util.Date());
        restservicehitinfo.setDescription("Bot or False hit");
        restservicehitinfoDAO.save(restservicehitinfo);
        String result="<?xml version=\"1.0\" encoding=\"UTF-8\"?><main></main>";

        return Response.ok(result).header("Access-Control-Allow-Origin", "*").header("Access-Control-Allow-Methods", "GET, POST, PUT, UPDATE, OPTIONS").header("Access-Control-Allow-Headers", "Content-Type, Accept").build();

    
catch(Exception e)
    e.printStackTrace();
    log.error("error in fetchbusads rest service : " + e);
    return null;


====================================== 调用该类的客户端代码如下

url="http://<<domainname.com>>/rest/FetchBusSer/fetchbusads?pid="+partnerId+"&ip="+ipadd;
$.ajax(
type: 'GET',
crossOrigin: true,
url: url,
contentType: "application/xml",
 success: function(data)
alert('insuccess : ' + data);
if(data)
//alert(xml);
   var main  = data;
    var image;
   var method=eval(main.getElementsByTagName("main"));
   for(var i=0;i<method.length;i++)
    var tmp=main.getElementsByTagName("data");
     var infoDiv='';

      for(var j=0;j<tmp.length;j++)
      if(tmp[j].getElementsByTagName('imgpath')[0].firstChild!=null)   

         if(j==0)
         infoDiv+='<li style="display:block;">';
         else
         infoDiv+='<li style="display:none;">';
         infoDiv+='<div class="adcontentDynList">';
        image=tmp[j].getElementsByTagName('imgpath')[0].firstChild.data;
        var url='http://servveradd/hitFromRsServiceLink.action?pid='+partnerId;
         infoDiv+='<a href='+url+' target="_blank">';
         infoDiv+='<img src="http://serveradd'+image+'" class="imageset"/>';
         infoDiv+='</a>';
         infoDiv+='</div>';
         infoDiv+='</li>';
        // alert(infoDiv);
        
        
         document.getElementById("ticker_"+partnerId).innerhtml=infoDiv;
    
else

,
error: function(jqXHR, textStatus, errorThrown)  alert('something bad happened : ' + errorThrown+'-- '+textStatus+'--'+jqXHR); 
);

================================================ ========

到目前为止成功 - 当我查看 firebug NET 选项卡时,我看到两个调用而不是一个。第一个调用与 response 及其 header and origin 集完美。但隐式的第二个调用不包含任何响应。请看屏幕截图 当我通过 firebug NET 选项卡查看时,我在浏览器中得到了响应..

Check the two calls instead of 1, First is correct and 2nd is error

====== 另一张图片是萤火虫控制台 =========

second image is for console of firebug 专家 我花了一整天的时间来完成这项工作,但没有成功。请帮忙

谢谢

【问题讨论】:

有人有兴趣回答这个具有挑战性的问题。专家在这里? 【参考方案1】:

仅供参考,我找到了答案。错误的原因是字符串对象无法正确转换为响应对象。解决方案如下 而不是返回这个

return Response.ok(allAdsString.toString()).header("Access-Control-Allow-Origin", "*").header("Access-Control-Allow-Methods", "GET, POST, PUT, UPDATE, OPTIONS").header("Access-Control-Allow-Headers", "Content-Type, Accept").build();

我把语句改成

return Response.ok().entity(new GenericEntity<String>(allAdsString.toString()) ).header("Access-Control-Allow-Origin", "*").header("Access-Control-Allow-Methods", "GET").build();

解决了

【讨论】:

以上是关于从其他域(jquery ajax)访问托管在 aws ec2 上的 rest 服务但出现 CORS 错误的主要内容,如果未能解决你的问题,请参考以下文章

AWS S3 静态站点 CORS jquery ajax POST 到 API Gateway

JQuery+ajax+jsonp 跨域访问

JQuery+ajax+jsonp 跨域访问

解决jquery ajax在跨域访问post请求的时候,ie9以下无效(包括ie9)的问题

AWS 能否支持托管 SaaS

29 Jquery Ajax跨域访问