【问题标题】:Simple Java HTTP Server application that responds in JSONP以 JSONP 响应的简单 Java HTTP Server 应用程序
【发布时间】:2021-02-03 16:57:14
【问题描述】:

我想创建一个非常简单的带有 JSONP 响应的 HTTP 服务器 Java。
代码如下:

public static void main(String[] args) throws Exception {
     HttpServer server = HttpServer.create(new InetSocketAddress(8500), 0);
      HttpContext context = server.createContext("/test");
      context.setHandler(Sample::handleRequest);
      server.start();
     System.out.println("Server started on port 8500");
    }    
 
 private static void handleRequest(HttpExchange exchange) throws IOException {
      JSONObject json = new JSONObject("{\"weight\":\"23400\"}");
      exchange.getResponseHeaders().add("Access-Control-Allow-Origin", "*");
      exchange.getResponseHeaders().add("Access-Control-Allow-Headers","origin, content-type, accept, authorization");
      exchange.getResponseHeaders().add("Access-Control-Allow-Credentials", "true");
      exchange.getResponseHeaders().add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD");
      exchange.getResponseHeaders().set("contentType", "application/json; charset=UTF-8");
      exchange.sendResponseHeaders(200, json.toString().getBytes().length);
      OutputStream os = exchange.getResponseBody();
      os.write(json.toString().getBytes());
      os.close();
  }

和客户:

$(document).ready(function () {
        $.ajax({
            url: 'http://localhost:8500/test/',
            type: "GET",
            dataType: "jsonp",
            data: { no: 120 },
            contentType: 'application/json',
            success: function (data) {
                $('#txtWeight').val(data);
            },
            error: function (err) {
                console.log( err);
            }
        });
    });

我遇到的问题与 HTTP 处理程序有关。 Chrome 返回:
Cross-Origin Read Blocking (CORB) block cross-origin response http://localhost:8500/test/?callback=jQuery34109210173679568667_1603222391566&no=120&_=1603222391567 with MIME type text/plain

如果有问题,请您看看并告诉我吗?

【问题讨论】:

    标签: java jsonp httpserver cross-origin-read-blocking


    【解决方案1】:

    您需要将“*”替换为您在标题中收到的“Origin”。 问题与 Chrome 相关,与 java 无关。

            private static void handleRequest(final HttpExchange exchange) throws IOException {
        final String json = "{\"weight\":\"23400\"}";
        final String origin = exchange.getRequestHeaders().getFirst("Origin");
        if(origin != null) exchange.getResponseHeaders().add("Access-Control-Allow-Origin", origin);
        exchange.getResponseHeaders().add("Access-Control-Allow-Headers","origin, content-type, accept, authorization");
        exchange.getResponseHeaders().add("Access-Control-Allow-Credentials", "true");
        exchange.getResponseHeaders().add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD");
        exchange.getResponseHeaders().set("contentType", "application/json; charset=UTF-8");
        exchange.sendResponseHeaders(200, json.getBytes().length);
        try(OutputStream os = exchange.getResponseBody()) {
            os.write(json.getBytes());
            os.flush();
        }
        exchange.close();
    }
    

    【讨论】:

    • 不,我的意思是在 HTTP 协议中您会收到许多标头字段。其中之一是“起源”。从交换中,您可以获取 getRequestHeader,然后获取“Origin”标头的值。使用此值。
    • 你的意思是我必须改变exchange.getResponseHeaders().add("Access-Control-Allow-Origin", "http://localhost:8500"); ??
    • 对不起答案不起作用,Chrome返回:net::ERR_EMPTY_RESPONSE
    • 也解决这个问题。但原来的问题已经通过以下行解决了:exchange.getResponseHeaders().add("Access-Control-Allow-Origin", exchange.getRequestHeaders().getFirst("Origin"));
    • 还是不行,exchange.getRequestHeaders().getFirst("Origin") 为空。
    猜你喜欢
    • 2015-04-18
    • 1970-01-01
    • 2014-06-06
    • 1970-01-01
    • 2017-08-21
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多