无法在javascript中向java Web服务(泽西岛)发出CORS POST请求?

我正在使用Jersey.I创建资源,在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请求:

     JavaScript Client  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); } }; }       

当我在chrome中单击getSubjects Button时,我收到错误:XMLHttpRequest无法加载..localhost:8888 / WebservicesServer / restful / getserver / getSubjects。 Access-Control-Allow-Origin不允许使用null但是我能够得到GET请求的响应 ,问题是POST请求我的浏览器url文件:/// E:/Documents%20and%20Settings/Srinivas/Desktop/wars/JSClient2.html(文件系统)我试过很多通过设置原点等方式,仍然无法获得json响应(服务器是Tomcat 7)请帮助克服这个问题。

如果您正在使用CORS,那么您应该将其实现为filter,而不是尝试将其嵌入到每个资源的每个方法中。 这是一个简单的例子(如果你担心的话,你可能想调整设置以限制它):

 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; } }