我正在学习如何在使用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是如何默认设置的,也没有通知或错误消息。
提前致谢
1条答案
按热度按时间f8rj6qna1#
你是对的,你所面临的问题可能与CORS(跨域资源共享)政策有关。默认情况下,Java的HTTP服务器不启用CORS,这可能会导致浏览器由于同源策略而阻止Next.js发出的请求。
要在JavaHTTP服务器中启用CORS,可以在MyHttpHandler类中向HTTP响应添加适当的头。以下是如何修改handle()方法以启用CORS:
字符串
在上面的代码中,使用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的特定来源。