2015-12-21 86 views
0

我面臨着與跨域PUT通話的問題,我已經允許訪問控制允許來源從服務器端工作,把仍沒有關係沒有工作。跨域PUT調用不會訪問控制允許來源

@PUT 
    @Path("/getresponse/{caller}") 
    @Produces({MediaType.APPLICATION_JSON}) 
    public Response getResponseData(@PathParam("caller") String caller ,@QueryParam("ticket")String ticket ,@FormParam("formParam") String data){ 


     ResponseBuilder resp; 
     System.out.println("name of caller is -> "+ caller); 
     System.out.println("query param ticket -> "+ ticket); 
     System.out.println("form param data->" + data); 
     Employee emp = new Employee(); 
     emp.setAge(23); 
     emp.setName("data"); 
     Gson gson = new Gson(); 
     String responseJson = gson.toJson(emp); 
     resp=Response.ok(responseJson);//header("Access-Control-Allow-Origin", "*") 
     resp.header("Access-Control-Allow-Origin", "*") 
     .header("Access-Control-Allow-Methods", "GET, POST, PUT, OPTIONS"); 

     return resp.build(); 
    } 

每當我調用它從jquery的AJAX方法,它說 響應預檢請求未通過訪問控制檢查:否「訪問控制允許來源」標題存在於所請求的資源

我有以上服務的,但與POST簽名時,我把它叫做沒有任何問題 郵政服務代碼調用服務,服務相同的副本

@POST 
    @Path("/getresponses/{caller}") 
    @Produces({MediaType.APPLICATION_JSON}) 
    public Response getResponseData1(@PathParam("caller") String caller ,@QueryParam("ticket")String ticket ,@FormParam("formParam") String data){ 


     ResponseBuilder resp; 
     System.out.println("name of caller is -> "+ caller); 
     System.out.println("query param ticket -> "+ ticket); 
     System.out.println("form param data->" + data); 
     Employee emp = new Employee(); 
     emp.setAge(23); 
     emp.setName("data"); 
     Gson gson = new Gson(); 
     String responseJson = gson.toJson(emp); 
     resp=Response.ok(responseJson);//header("Access-Control-Allow-Origin", "*") 
     resp.header("Access-Control-Allow-Origin", "*") 
     .header("Access-Control-Allow-Methods", "GET, POST"); 
     return resp.build(); 
    } 

我的客戶端代碼是

$(document).ready(function(){ 
    // for post service 
    $('#sendcall').on('click',function(e){ 
     var dataTosend ="formParam=data to send"; 
     $.ajax({ 
       url: 'http://someip:8099/Jqgrid/rest/getdata/getresponses/data?ticket=tick', 
       contentType : 'application/x-www-form-urlencoded', 
       data :dataTosend, 
       type: 'POST', 
       success: function(data){ 
       alert(data); 
       } 
      }); 
    }); 

    //for PUT service 
    $('#sendcall2').on('click',function(e){ 
     var datatosend ="formParam=data to send"; 
     $.ajax({ 
       url: 'http://someip:8099/Jqgrid/rest/getdata/getresponse/aliahsan?ticket=tick', 
       contentType : 'application/x-www-form-urlencoded', 
       data :datatosend, 
       type: 'PUT', 
       crossDomain:true, 
       beforeSend: function (xhr) { 

        console.log('header added'); 
       }, 
       success: function(data){ 
       alert(data); 
       } 
      }); 
    }); 
}); 

請幫我在這方面爲什麼PUT不能使用這個。 任何幫助將不勝感激

+1

不要在方法中添加CORS標頭。 [使用過濾器](http://stackoverflow.com/a/28067653/2587435) –

+0

爲什麼在過程中使用過濾器但不使用方法中的CORS @peeskillet – Ali

+1

CORS的工作原理是,首先有一個預檢請求,它是OPTIONS請求(在實際請求之前),嘗試獲取CORS頭文件。所以方法中的頭文件什麼都沒有。 –

回答

4

而不是在您的資源方法內添加所有的CORS頭,使用澤西島過濾器,如in this post所述。這樣做的原因,是CORS預檢請求,這是在HTTP access control (CORS)定義爲:

「預檢」請求第一發送由OPTIONS方法對其他域的資源的HTTP請求,以確定實際請求是否安全發送。

所以這個請求是一個OPTIONS請求,它期望返回「Accept-Xxx」CORS頭來確定服務器允許的內容。因此,將這些標頭放在資源方法中不會產生任何影響,因爲請求是使用OPTIONS HTTP方法進行的,而您沒有資源方法。這通常會導致發送給客戶端的405方法不允許錯誤。

在過濾器中添加標題時,每個請求都會經過此過濾器,即使是OPTIONS請求,也是如此,因此預檢會獲取相應標題。

對於PUT,也

跨站請求被預檢這樣上述鏈接的文檔(從上面的報價仍在進行中)中描述,因爲它們可以具有對用戶數據的影響。特別是,如果發生以下情況,請求將被預衝:

  • 它使用GET,HEAD或POST以外的方法。另外,如果POST用於發送具有除application/x-www-form-urlencoded,multipart/form-data或text/plain之外的Content-Type的請求數據,如果POST請求使用application/xml或text/xml向服務器發送XML有效內容,則會請求該請求。
  • 它設置自定義首部的請求(例如請求使用的報頭,如X PINGOTHER)

這就是爲什麼POST請求不面臨同樣的問題。

相關問題