Javascript 为什么会出现错误';访问控制允许原点不允许';在我使用setRequestHeader之后?

Javascript 为什么会出现错误';访问控制允许原点不允许';在我使用setRequestHeader之后?,javascript,ajax,web-services,Javascript,Ajax,Web Services,找了一会儿,我还是找不到答案。 我的问题是,当我调用web服务函数setRequestHeader时,我得到了错误“访问控制允许源不允许” 以下是我的javaScript代码: var loginController = new sap.ltst.login.loginController({controllerName: "sap.ltst.login.loginController"}); var session = loginController.login("I051486", "123

找了一会儿,我还是找不到答案。 我的问题是,当我调用web服务函数setRequestHeader时,我得到了错误“访问控制允许源不允许”

以下是我的javaScript代码:

var loginController = new sap.ltst.login.loginController({controllerName: "sap.ltst.login.loginController"});
var session = loginController.login("I051486", "123456789");
var config = {};
$.ajax({
    beforeSend: function(req) {
        req.setRequestHeader('Authentication', 'Authentication-Token ' + session.session_token);
    },
    url : "http://localhost:8081/com.sap.st.gtpapi/program/"
            + this.program + "/configs",
    dataType : 'json',
    type : 'GET',
    async : false,
    success : function(data) {
        config = data;
    }
});
return config;
在web服务端,我有一个可以启用或禁用身份验证的功能。我尝试将auth设置为false(不检查auth),然后删除setRequestHeader,没有出现错误,web服务返回了一些数据

另一方面,我试着把它放回原处,我得到了错误

 XMLHttpRequest cannot load http://localhost:8081/gtpapi/program/Business%20Intelligence%20platform%204.1%20(BI%20Aurora%204.1)/configs. Origin http://localhost:8080 is not allowed by Access-Control-Allow-Origin. 
所以我不认为这是身份验证的问题,因为在web服务端,我禁用了身份验证

让我们转到web服务端,这是接口:

    public static final String HEADER_AUTH_TOKEN = "Authentication-Token";
    @GET
    @Consumes({MediaType.APPLICATION_JSON})
    @Produces({MediaType.APPLICATION_JSON})
    @Path("/guid_{planId}/packages/{packId}/{results}")
    public Response setPackageResult(@PathParam("planId") final String planGuid,    @PathParam("packId") final String packGuid, @PathParam("results") final String results, @HeaderParam(WebServiceBase.HEADER_AUTH_TOKEN) String token);
这是Chrome上的标头响应et请求:

Request       URL:http://localhost:8081/com.sap.st.gtpapi/program/SBOP%20EXPLORER%204.1/configs
Request Method:OPTIONS
Status Code:200 OK
Request Headersview source
Accept:*/*
Accept-Charset:UTF-8,*;q=0.5
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8,fr;q=0.6
Access-Control-Request-Headers:accept, authentication, origin
Access-Control-Request-Method:GET
Cache-Control:no-cache
Connection:keep-alive
Host:localhost:8081
Origin:http://localhost:8080
Pragma:no-cache
Referer:http://localhost:8080/LTST_Frontend/index.html
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31
Response Headersview source
Allow:GET,OPTIONS,HEAD
Content-Length:0
Content-Type:text/xml
Date:Fri, 02 Aug 2013 15:44:10 GMT
Server:Apache-Coyote/1.1

我不确定我是否犯了一些错误,问题是来自javaScript还是web服务。有什么想法吗?

将您想要发送的任何标题放入安全列表:

header("Access-Control-Allow-Headers: Authentication, X-Custom-Header, .. etc");

这应该是
接收域上的
CORS
头的一部分。

不同的端口是不同的origin@Esailija但是当我不使用setRequestHeader时,为什么我没有得到错误?可能是8081使用CORS头响应,但不允许凭据。否则看起来像是安全漏洞。。请参见此处,不同的端口是不同的来源尝试将
crossDomain:true
添加到
$中。ajax
function@PRPGFerret我已经试过了,但没用。你能给我解释一下更多的细节吗?我不确定我应该把它放在哪里,在web服务或客户端。在web服务中,你的其他
CORS
头在哪里。这是我尝试过的,但不起作用。公共静态响应sendResponse(字符串内容){ResponseBuilder Response=ok(content);Response.header(“访问控制允许来源”,“*”);Response.header(“访问控制允许来源”,“身份验证,来源,内容类型,接受”);Response.header(“访问控制允许凭据”,true);return Response.build();}