无法在 JavaScript 中向 Java Web 服务(球衣)发出 CORS POST 请求?

Posted

技术标签:

【中文标题】无法在 JavaScript 中向 Java Web 服务(球衣)发出 CORS POST 请求?【英文标题】:Unable to make CORS POST request in javascript to java web service(jersey)? 【发布时间】:2013-02-12 05:29:30 【问题描述】:

我正在使用 Jersey 在 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 作为发布请求:

<!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>

当我单击 chrome 中的 getSubjects 按钮时,我收到 错误:XMLHttpRequest cannot load ..localhost:8888/WebservicesServer/restful/getserver/getSubjects。 Access-Control-Allow-Origin 不允许 Origin null。 但我可以通过 GET 请求得到响应,问题在于 POST 请求 我的浏览器 url file:///E:/​​Documents%20and%20Settings/Srinivas/Desktop/wars/JSClient2.html (文件系统)我尝试了很多方法,比如设置原点等,仍然无法得到 json 响应(服务器是 Tomcat 7)请帮助解决这个问题。

【问题讨论】:

【参考方案1】:

如果您使用 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;
  

【讨论】:

感谢您的回复。所以我已经在 web.xml 中注册了这个过滤器并像以前一样请求资源,这会在响应中添加标头? 是的,这将被添加到所有回复中。

以上是关于无法在 JavaScript 中向 Java Web 服务(球衣)发出 CORS POST 请求?的主要内容,如果未能解决你的问题,请参考以下文章

jsp中向浏览器页面输出的方式总结

在 Java 中向 Firebase 中的特定主题发送通知

如何在javascript中向后移动画布?

在 javascript 中向 HTML5 视频添加源?

如何在 JavaScript 中向 DOM 元素添加类?

如何在 Javascript 中向 btn.innerHTML 添加函数?