javascript - "Cross-Origin Request Blocked: The Same Origin Policy"浏览器错误

标签 javascript rest cors

当我尝试将 JSON 文件发布到我的服务器时,出现此错误。

在我的服务器端,代码是:

@POST
@Path("updatedata")
@Produces("text/plain")
@Consumes("application/json")
public Response UpdateData(String info) {
    Gson gson = new Gson();
    List<Data> list = gson.fromJson(info, new TypeToken<List<Data>>() {
    }.getType());

    int is_success = 0;
    try {
      is_success += trainingdata.updateData(list);
    } catch (SQLException e) {
      e.printStackTrace();
    }
    String returnjson = "{\"raw\":\"" + list.size() + "\",\"success\":\"" + is_success + "\"}";
    return Response.ok().entity(returnjson).header("Access-Control-Allow-Origin", "*").header("Access-Control-Allow-Methods", "POST").build();
}

我可以通过 RESTClient(一款 Chrome 插件)成功更新我的数据。

但是当我构建前端并尝试通过 javascript 调用 API 时, Firefox 显示:跨源请求被阻止:同源策略... Chrome 显示: XMLHttpRequest 无法加载...请求的资源上不存在“Access-Control-Allow-Origin” header 。因此,不允许访问原点“...”

我这样编写了 JavaScript:

var json = JSON.stringify(array);

var xhr = new XMLHttpRequest();
xhr.open("POST", "http://myurl:4080/updatedata", true);
xhr.setRequestHeader("Content-Type", "application/json");
xhr.send(json);

xhr.onload = function (e) {
    if (xhr.readyState === 4) {
        if (xhr.status === 200) {
            alert('hello');
        }
    }
};
xhr.onerror = function (e) {
    console.error(xhr.statusText);
};

我的 JavaScript 代码有问题吗?

我将后端代码和前端代码部署在同一台计算机上。

GET 函数成功运行。

@GET
@Produces("application/json")
@Path("/{cat_id}")
public Response getAllDataById(@PathParam("cat_id") String cat_id) {
    ReviewedFormat result = null;
    try {
        result = trainingdata.getAllDataById(cat_id);
        Gson gson = new Gson();
        Type dataListType = new TypeToken<ReviewedFormat>() {
        }.getType();
        String jsonString = gson.toJson(result, dataListType);
        return Response.ok().entity(jsonString).header("Access-Control-Allow-Origin", "*").header("Access-Control-Allow-Methods", "GET").build();

    } catch (SQLException e) {
        logger.warn(e.getMessage());
    }
    return null;
}

前端:

var xhr = new XMLHttpRequest();
xhr.open("GET", "http://URL:4080/mywebservice/v1/trainingdata/" + cat_id, true);

xhr.onload = function (e) {
    if (xhr.readyState === 4) {
        if (xhr.status === 200) {
            //console.log(xhr.responseText);
            var jsoninfo = xhr.responseText;
            var obj = JSON.parse(jsoninfo);
        }
     }
}

最佳答案

CORS 可以防止跨站点攻击发生问题,并通过不依赖其他人的资源(可能会消亡)来强制进行智能开发。它是大多数服务器和浏览器上的默认安全功能。

在 Apache 中,您可以通过添加 header 来禁用 CORS,IIS 和 AppEngine 的工作原理类似。

由于您是在本地开发,因此最好的选择是 XAMPP/WAMPP 加上适当的 header - 或者干脆切换到 FireFox。

FireFox 不考虑 CORS 下的本地文件,而大多数浏览器会考虑。

Apache 修复:

添加标题->

Header set Access-Control-Allow-Origin "*"

重置服务器->

apachectl -t
  • sudo 服务 apache2 重新加载

IIS 修复:

修改根目录下的web.config(类似HTAccess)

<?xml version="1.0" encoding="utf-8"?>
<configuration>
 <system.webServer>
   <httpProtocol>
     <customHeaders>
       <add name="Access-Control-Allow-Origin" value="*" />
     </customHeaders>
   </httpProtocol>
 </system.webServer>
</configuration>

App Engine:

Python 的 header 方法:self.response.headers.add_header()

class CORSEnabledHandler(webapp.RequestHandler):
  def get(self):
    self.response.headers.add_header("Access-Control-Allow-Origin", "*")
    self.response.headers['Content-Type'] = 'text/csv'
    self.response.out.write(self.dump_csv())

对于 Java:resp.addHeader()

public void doGet(HttpServletRequest req, HttpServletResponse resp) {
  resp.addHeader("Access-Control-Allow-Origin", "*");
  resp.addHeader("Content-Type", "text/csv");
  resp.getWriter().append(csvString);
}

对于 Go:w.Header().Add()

func doGet(w http.ResponseWriter, r *http.Request) {
  w.Header().Add("Access-Control-Allow-Origin", "*")
  w.Header().Add("Content-Type", "text/csv")
  fmt.Fprintf(w, csvData)
}

如果您对此感兴趣,可以通过 GET 请求的 JSONP 绕过 CORS 问题:http://en.wikipedia.org/wiki/JSONP

关于javascript - "Cross-Origin Request Blocked: The Same Origin Policy"浏览器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26877774/

相关文章:

javascript - 有没有办法在 AdonisJS 4.1.0 中进行条件查询?

javascript - Firefox 扩展 - 最佳实践

java - 如何在 Spring REST Servlet 旁边使用 CXF Soap Servlet?

java - Spring启动状态”:415 ,"error":"Unsupported Media

angularjs - C# Rest API 返回带双引号的字符串

maven - 如何在Sonatype Nexus上启用CORS?

javascript - 如何使用 typicode/lowdb 文件数据库更新项目数组?

javascript - knockout 所选选项绑定(bind)

cors - Quarkus Http Cors 接受 JSON

ajax - 从网站表单写入谷歌文档时遇到 CORS 错误