请求被CORS策略阻止,标头未响应

时间:2019-07-21 06:25:52

标签: cors java-ee-7 jersey-1.0

我有一个与我使用Java8和JavaEE7和它的库Jersey1.19创建的RESTful服务器通信的应用程序,我正面临被CORS问题阻止的请求。我添加了标头以防止这种情况,但我在响应中看不到它们。我已经问过Google太多事情了,却找不到方法:'(服务器(服务器是Tomcat8)

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Response test() {
      try {
        Class.forName("com.mysql.cj.jdbc.Driver");
        con = DriverManager.getConnection("jdbc:mysql://localhost:3306/javatuto", "root", "************");
        Statement stmt = con.createStatement();
        ResultSet rs = stmt.executeQuery("select * from users where login=\"*******\" and password=\"*****************\";");
        if (rs != null) {
          rs.next();
          String message;
          JsonObject json = new JsonObject();
          json.put("id", rs.getInt(1));
          message = json.toString();
          String resultString = writeJSON(json);
          return Response.ok()
            .entity(resultString)
            .header("Access-Control-Allow-Origin", "*")
            .header("Access-Control-Allow-Methods", "POST, GET, PUT, UPDATE, OPTIONS")
            .header("Access-Control-Allow-Headers", "Content-Type, Accept, X-Requested-With")
            .build();
        }
        con.close();
      } catch (Exception e) {System.out.println(e);}
      return null;
    }

    private String writeJSON(JsonObject p) throws JsonGenerationException, IOException {
      ObjectMapper mapper = new ObjectMapper();   
      String jsonInString = mapper.writeValueAsString(p);
      return  jsonInString;
    }

我原本希望得到带有标头的响应,但是却得到了:

响应标题:
允许:OPTIONS,HEAD,GET
内容长度:439
内容类型:application / vnd.sun.wadl + xml
日期:2019年7月21日,星期日,05:39:00 GMT
最后修改日期:2019年7月21日,星期日CEST
伺服器:Apache-Coyote / 1.1
有所不同:接受

响应:
从原点“ http://localhost:8080/rest/thisthat/hello”到“ http://localhost:4200”处对XMLHttpRequest的访问已被CORS策略阻止:对预检请求的响应未通过访问控制检查:否'Access-Control-Allow-来源的标头出现在请求的资源上。

感谢您的时间!

编辑:
@sideshowbarker
:这是答案:
请求网址:http://localhost:8080/rest/thisthat/hello
请求方法:OPTIONS
状态码:200 OK
远程地址:[:: 1]:8080
推荐人政策:no-referrer-when-downgrade

@Mikhail Burshteyn :当我阅读此文档时,我了解到我必须设置更多的标头,以便服务器告诉我是否允许这些请求,我做对了吗?喜欢:

return Response.ok()
    .entity(resultString)
    .header("OPTIONS", "http://localhost:8080/rest/thisthat/hello ")
    .header("Access-Control-Request-Method", "GET")
    .header("Access-Control-Request-Headers", "origin, x-requested-with")
    .header("Origin", "http://localhost:4200")
    .header("Access-Control-Allow-Origin", "*")
    .header("Access-Control-Allow-Methods", "POST, GET, PUT, UPDATE, OPTIONS")
    .header("Access-Control-Allow-Headers", "Content-Type, Accept, X-Requested-With")
    .build();

我尝试过,但是没有用。我刚刚在响应标头中看到我允许OPTIONS,HEAD和GET。

我也忘了告诉你,当我使用启用了禁用网络安全性的浏览器时,它可以工作。

1 个答案:

答案 0 :(得分:0)

我通过设置反向代理来解决它。同一域意味着没有CORS问题:

mydomain/host => localhost:4200
mydomain/hello => localhost:8080/rest/thisthat/hello

但是,我仍然想了解如何在没有Spring框架的情况下将标头添加到响应中。该解决方案意味着每个新页面都需要其代理配置。有人可以给我一些答案吗?我在论坛的某个地方发现CORS是Angular安全性的,这就是Java后端必须提供标头的原因。真的吗?我也尝试在Tomcat中设置一些选项。我们确实可以在Tomcat中设置CORS规则,但我也不能使其起作用,响应头不包含任何内容。还有一个Nginx服务器重定向请求。关于如何查看其中一个重置后端请求的标头或我们是否可以告诉他们自动添加这些标头的任何线索?