2013-02-26 36 views
1

我在Java Web服務使用Jersey.I創建資源作爲followes實現跨資源產地共享:無法在JavaScript中將CORS POST請求發送到java web服務(球衣)?

@POST 
    @Path("/getSubjects") 
    @Consumes(MediaType.APPLICATION_JSON) 
    @Produces(MediaType.APPLICATION_JSON) 
    public Response getSubjects(TokenCheck tc) throws IOException, ServletException{ 
     String token = tc.getToken(); 
     String result = ""; 
     if(!token.equals("") && !token.equals(null)){ 
      context.getRequestDispatcher("/GetSubjectsWs?token="+token).include(request, response); 
      String subs = request.getAttribute("subjects").toString(); 
      result = "{\"subjects\":\""+subs+"\"}"; 
     }else { 
      result = "{\"subjects\":\"['Invalid Token login again']\"}"; 
     } 
     JSONObject j = null; 
     try { 
      j = new JSONObject(result); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
     return Response.status(200).entity(j).header("Access-Control-Allow-Origin", "*").header("Access-Control-Allow-Methods", "POST, GET, OPTIONS").header("Access-Control-Allow-Headers", "Content-Type:application/json").build(); 
    } 

,並使用JavaScript作爲使POST請求:

<!DOCTYPE html> 
<html> 
<head> 
<meta charset="utf-8"> 
<title>JavaScript Client</title> 
<script type="text/javascript"> 
function restReq() { 
    var url = "http://localhost:8888/WebservicesServer/restful/getserver/getSubjects"; 
    var json = { 
      "token":"8495C211F11C9B18E6651E03EB2995BC" 
    }; 
    var client = new XMLHttpRequest(); 
    client.open("POST", url, true); 
    client.setRequestHeader("Access-Control-Request-Methods", "POST"); 
    client.setRequestHeader("Content-Type", "application/json"); 
    client.send(json); 
    client.onreadystatechange = function() { 
     if (client.readyState == 4) { 
      if (client.status == 200) 
       console.log("success: " + client.responseText); 
      else 
       console.log("error: " +client.status+" "+ client.responseText); 
     } 
}; 
} 
</script> 
</head> 
<body> 
<input type="button" value="getSubjects" onclick="restReq();"> 
</body> 
</html> 

當我點擊getSubjects按鈕在鉻我得到錯誤爲:XMLHttpRequest無法加載..本地主機:8888/WebservicesServer/restful/getserver/getSubjects。 Access-Control-Allow-Origin不允許原始空值。 但我能夠得到迴應與GET請求,問題是與POST請求 我的瀏覽器url文件://E:/Documents%20and%20Settings/Srinivas/Desktop/wars/JSClient2.html (文件系統)我嘗試了很多方式,比如設置origin等,仍然無法獲得json響應(Server是Tomcat 7),請幫助解決這個問題。

回答

4

如果您正在使用CORS,那麼您應該將其作爲過濾器來實現,而不是試圖將其嵌入每種資源的每種方法中。這裏有一個簡單的例子(你可能想調整設置來限制它,如果這是你所關心的):

import com.sun.jersey.spi.container.ContainerRequest; 
import com.sun.jersey.spi.container.ContainerResponse; 
import com.sun.jersey.spi.container.ContainerResponseFilter; 

/** 
* Filter to handle cross-origin resource sharing. 
*/ 
public class CORSFilter implements ContainerResponseFilter 
{ 
    private static final String ORIGINHEADER = "Origin"; 
    private static final String ACAOHEADER = "Access-Control-Allow-Origin"; 
    private static final String ACRHHEADER = "Access-Control-Request-Headers"; 
    private static final String ACAHHEADER = "Access-Control-Allow-Headers"; 

    public CORSFilter() 
    { 
    } 

    @Override 
    public ContainerResponse filter(final ContainerRequest request, final ContainerResponse response) 
    { 
    final String requestOrigin = request.getHeaderValue(ORIGINHEADER); 
    response.getHttpHeaders().add(ACAOHEADER, requestOrigin); 

    final String requestHeaders = request.getHeaderValue(ACRHHEADER); 
    response.getHttpHeaders().add(ACAHHEADER, requestHeaders); 
    return response; 
    } 
} 
+0

謝謝你的回覆。所以我已經註冊了這個過濾器在web.xml和請求資源和以前一樣,這將添加標題的響應? – 2013-02-27 04:35:25

+0

是的,這將被添加到所有回覆。 – jgm 2013-02-27 08:04:31

相關問題