gpt4 book ai didi

java - 在 Java Web 服务中启用 CORS

转载 作者:太空宇宙 更新时间:2023-11-04 09:55:10 25 4
gpt4 key购买 nike

注意:我已经找到了解决方案。我只是发布问题和解决方案,以防其他人遇到类似问题

长话短说:

当我有一个 REACT 客户端应用程序向我在 NetBeans 运行的 Payara 服务器上运行的 Java Web 服务器发出 HTTP 请求时,我在浏览器的“开发人员工具”窗口中收到此 CORS 错误消息:

SEC7120: [CORS] The origin 'http://localhost:3000' did not find 'http://localhost:3000' in the Access-Control-Allow-Origin response header for cross-origin resource at 'http://localhost:8080/DatabaseWebService/databaseConnectorMethod'.

有关 CORS 的更多信息,请参阅此网站 https://enable-cors.org/

长篇故事详细说明:

我有一个在 http://localhost:3000 上运行的 REACT 项目向 Java Web 服务(DatabaseWebService)发送 HTTP 请求,该服务在本地 Payara 服务器版本 4.1.1 上运行。 REACT 应用程序请求的 Web 服务 URL 为“http://localhost:8080/DatabaseWebService/databaseConnectorMethod” '

每次运行 REACT 代码时,我都会收到上面列出的 CORS 错误。

这是我发出 http post 请求的 REACT 代码:

            const postData = new URLSearchParams();
postData.append('var1', 'somedata1');
postData.append('var2', 'somedata2');
let axiosConfig = {
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
}
};

axios.post('http://localhost:8080/DatabaseWebService/databaseConnectorMethod', postData, axiosConfig)
.then((res) => {
console.log("AXIOS POST RESPONSE RECEIVED: ", res);
})
.catch((err) => {
console.log("AXIOS POST ERROR: ", err);
})

这是我的 servlet 代码:

public class DatabaseConnectorServlet extends HttpServlet {
@Override
final protected void doPost(final HttpServletRequest request, final HttpServletResponse response)
throws ServletException, IOException {

try {
System.out.println("DatabaseConnectorServlet Received a HTTP POST");

String var1= request.getParameter("var1");
String var2= request.getParameter("var2");
System.out.println(var1 + var2);
response.getWriter().print("I GOT YOUR MESSAGE");
} catch (Exception ex) {
response.getWriter().print(ex);
}
}

我在上面的 Java 代码中放置了断点,看到它被击中,并且我看到它执行了所有命令,包括 response.getWriter().print ,没有任何问题。但是,当我查看浏览器开发人员工具控制台窗口时,我确实看到了 CORS 异常。

最佳答案

解决方案在 Java Web 服务应用程序中,您需要添加一些 header 以允许 Response 对象中的 CORS。这是更新后的 Java 代码,请注意额外的 response.addHeader 代码行:

public class DatabaseConnectorServlet extends HttpServlet {

@Override
final protected void doPost(final HttpServletRequest request, final HttpServletResponse response)
throws ServletException, IOException {

try {
System.out.println("DatabaseConnectorServlet Received a HTTP POST");
response.addHeader("Access-Control-Allow-Origin", "http://localhost:3000"); //Here's the extra line needed to allow CORS to your server side code

String var1 = request.getParameter("var1");
String var2 = request.getParameter("var2");
System.out.println(var1 + var2);
response.getWriter().print("I GOT YOUR MESSAGE");

} catch (Exception ex) {
response.addHeader("Access-Control-Allow-Origin", "http://localhost:3000");
response.getWriter().print(ex);
}
}

通过此更新的代码,我现在可以在运行 React 代码的 Web 浏览器开发人员工具的控制台窗口上看到示例“我收到了您的消息”文本。

这基本上允许来自不同域/端口(即本例中的 REACT 应用程序)的 http 请求访问来自此 java Web 服务的数据。

另外,为了让您知道,您可以包含一些其他附加标题(我在其他问题上看到的),我在我的情况下不需要这些标题,但可能对您有用。以下是附加 header 和一些示例值:

 response.addHeader("Access-Control-Allow-Origin", "http://localhost:3000");
response.addHeader("Access-Control-Allow-Headers", "Origin, Content-Type, Accept, X-Auth-Token");
response.addHeader("Access-Control-Allow-Credentials", "true");
response.addHeader("Access-Control-Request-Headers", "Origin, X-Custom-Header, X-Requested-With, Authorization, Content-Type, Accept");
response.addHeader("Access-Control-Expose-Headers", "Content-Length, X-Kuma-Revision");
response.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, PATCH, OPTIONS");

关于java - 在 Java Web 服务中启用 CORS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54239666/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com