繁体   English   中英

在Java Web Service中启用CORS

[英]Enabling CORS in Java Web Service

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

长话短说:

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

SEC7120:CORS]起源“ 的http://本地主机:3000 ”没有找到“ HTTP://本地主机:3000 ”在“访问控制允许来源响应头为跨域资源的http://本地主机:8080 / DatabaseWebService / databaseConnectorMethod

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

长话详细:

我有一个REACT项目在http:// localhost:3000上运行,并向我拥有的Java Web Service(DatabaseWebService)进行HTTP发布,该Java Web Service在本地Payara Server版本4.1.1上运行。 REACT应用程序请求的Web服务URL是' http:// localhost:8080 / DatabaseWebService / databaseConnectorMethod '

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

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

            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 Service应用程序中,您需要添加一些标头以允许在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浏览器开发者工具的控制台窗口上看到示例“ I GOT YOUR MESSAGE”文本。

基本上,这允许来自其他域/端口(即,在这种情况下为REACT应用程序)的http请求访问此Java Web服务的数据。

同样,为了使您知道,您可以包括一些其他标题(我在其他问题上看到),这些标题对于我的情况不是必需的,但可能对您有用。 以下是其他标题和一些示例值:

 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");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM