在Java中启用CORS而不使用spring(只是普通Java)

xoshrz7s  于 2023-08-02  发布在  Java
关注(0)|答案(1)|浏览(115)

我正在学习如何在使用Springboot之前单独使用Java构建HTTP服务器。当我在这个REST API上工作时,我试图通过Next.js发出请求。没有错误,但由于某种原因我无法获得数据。我猜这是Java服务器上的CORS策略。
所以我想知道如何启用CORS在主文件中,如果可能的话。
设置服务器的线程池为10,并调用MyHTTPHandler

package org.example;

import com.sun.net.httpserver.HttpServer;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;

public class Main {
    public static void main(String[] args) throws IOException {
        HttpServer server = HttpServer.create(new InetSocketAddress("localhost", 8080), 0);
        ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor) Executors.newFixedThreadPool(10);

        server.createContext("/test", new MyHttpHandler());
        server.setExecutor(threadPoolExecutor);
        server.start();
        System.out.println("Server started on port 8080");
    }
}

字符串
HTTP处理程序::浏览器发送消息“HEELLO”的简单GET请求

package org.example;

import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;

import java.io.IOException;
import java.io.OutputStream;

public class MyHttpHandler implements HttpHandler {
    @Override
    public void handle(HttpExchange httpExchange) throws IOException {
        System.out.println("REQUEST_METHOD::" + httpExchange.getRequestMethod());

        OutputStream outputStream = httpExchange.getResponseBody();
        String str = "HEELLO";
        if(httpExchange.getRequestMethod().equals("GET")){
            httpExchange.sendResponseHeaders(200, str.length());
            outputStream.write(str.getBytes());
            outputStream.flush();
            outputStream.close();
        }
    }
}


NEXT.JS FETCH FUNCTION::从Java Rest API获取数据并在控制台中显示

async function gett() {
    const res = await fetch(`http://localhost:8080/test`)

    return res
  }

export default async function Page() {

    const getData = gett()

    const [data1] = await Promise.all([getData])

    console.log(data1)

    return <h1>DASHBOARD/settings</h1>
  }


这段代码似乎没有抛出任何错误,但我觉得我错过了一些NEXT.js代码,我不能在谷歌上找到。从本质上讲,fetch似乎不起作用。我相信这是因为Java的CORS策略,但我不确定Java是如何默认设置的,也没有通知或错误消息。
提前致谢

f8rj6qna

f8rj6qna1#

你是对的,你所面临的问题可能与CORS(跨域资源共享)政策有关。默认情况下,Java的HTTP服务器不启用CORS,这可能会导致浏览器由于同源策略而阻止Next.js发出的请求。
要在JavaHTTP服务器中启用CORS,可以在MyHttpHandler类中向HTTP响应添加适当的头。以下是如何修改handle()方法以启用CORS:

public class MyHttpHandler implements HttpHandler {
    @Override
    public void handle(HttpExchange httpExchange) throws IOException {
        System.out.println("REQUEST_METHOD::" + httpExchange.getRequestMethod());

        // Enable CORS by adding the required headers
        httpExchange.getResponseHeaders().set("Access-Control-Allow-Origin", "*");
        httpExchange.getResponseHeaders().set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
        httpExchange.getResponseHeaders().set("Access-Control-Allow-Headers", "Content-Type");

        OutputStream outputStream = httpExchange.getResponseBody();
        String str = "HEELLO";
        if(httpExchange.getRequestMethod().equals("GET")){
            httpExchange.sendResponseHeaders(200, str.length());
            outputStream.write(str.getBytes());
            outputStream.flush();
            outputStream.close();
        }
    }
}

字符串
在上面的代码中,使用HttpExchange的responseHeaders的set()方法将必要的CORS头发送到HTTP响应。“Access-Control-Allow-Origin”header设置为“*",这允许任何来源访问资源(如果需要,您可以指定特定的来源)。“Access-Control-Allow-Methods”标头指定实际请求中允许的HTTP方法。“Access-Control-Allow-Headers”报头允许在实际请求中使用“Content-Type”报头。
设置了这些头文件后,Next.js应用程序应该能够向Java REST API发出成功的请求。
请注意,在“Access-Control-Allow-Origin”的值中启用CORS会允许任何网站访问您的API,这可能不适合生产环境。在生产中,建议指定允许访问API的特定来源。

相关问题