从其他域(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