gpt4 book ai didi

javascript - 为什么即使在设置 "esponse.addHeader("Access-Control-Allow-Origin", "*");"在 servlet 中,CORS 请求也会失败?

转载 作者:行者123 更新时间:2023-11-28 22:33:40 25 4
gpt4 key购买 nike

我有一个关于在云服务器上运行的 Tomcat 托管的 servlet 的问题。

我有一个 web 应用程序,包括(此时):

• 一个文件夹中有 13 个 HTML 文件

• 名为“css”的子文件夹中的单独 CSS 文件

• 位于名为“js”的子文件夹中的单独 Javascript (JS) 文件,其中包含许多库函数,包括 CORS 请求函数

• 打包在 WAR 文件中的 Java servlet

• 一个 web.xml 文件

• MySQL 数据库

我已经在笔记本电脑上使用 NetBeans(使用 WildFly 作为网络服务器)、MySQL 和 FireFox 浏览器测试了这个应用程序,一切都运行良好。

然后,我在云服务器上设置了 Tomcat,复制了数据库,安装了 WAR 和 web.xml 文件,并使用 Tomcat 控制面板设置了上下文路径。

我已经查阅了此处和其他位置的论坛,还检查了云托管提供商的论坛。我认为我正在做启用 CORS 请求所需的一切,但一定有一些细微的错误是我在某个地方犯的或我忽略的事情,我目前处于僵局。

Javascript 代码

我的 Javascript CORS 函数(在 JS 库文件中)如下所示:

function createCORSRequest(method, url) {
var xhr = new XMLHttpRequest();
// xhr.withCredentials = true; // do I even need to do this – and -
xhr.withCredentials = "true"; // which is correct – string or logical?
if ("withCredentials" in xhr) {
// Check if the XMLHttpRequest object has a "withCredentials" property.
// "withCredentials" only exists on XMLHTTPRequest2 objects.
xhr.open(method, url, true);
xhr.setRequestHeader("Content-Type", "application/json"); // is this correct?
} else if (typeof XDomainRequest != "undefined") {
// Otherwise, check if XDomainRequest.
// XDomainRequest only exists in IE, and is IE's way of making CORS requests.
xhr = new XDomainRequest();
xhr.open(method, url);
xhr.setRequestHeader("Content-Type", "application/json"); // is this correct?
} else {
// Otherwise, CORS is not supported by the browser.
xhr = null;
}
return xhr;
}

此外,在同一个文件的其他地方,我定义了函数的各种调用所需的常量:

var PARAM_CMD = "&cmd=";   

var CMD_GET_MAP = 310;

var PARAM_TBL = "&tbl=";

var PARAMS_GET_HASHMAP = PARAM_CMD + CMD_GET_MAP + PARAM_TBL;

var HASHMAP_STATES = 1130;

var urlname = "http://TestSite.com/TestServer/TestServer?autoReconnect=true&useSSL=false";

以下是此代码的典型调用:

function populateUSStatesBox() {
var fullURL = urlname + PARAMS_GET_HASHMAP + HASHMAP_STATES;
var xmlhttp = createCORSRequest("GET", fullURL);
// handle changes to the request state
xmlhttp.onreadystatechange = function () {
if ((xmlhttp.readyState === XMLHttpRequest.DONE) && (xmlhttp.status === HTTP_RESP_OK)) {
var StatesMap = JSON.parse(xmlhttp.responseText);
setupComboBox ("cboUSStates", StatesMap);
}
}
// send the http GET request with the command parameters sent in the header
xmlhttp.send();
}

Java代码

在服务器端,在 servlet 的 doGet 代码开始附近,我根据我在各种论坛上看到的帖子设置响应 header 值。我实际上只发送[大部分] GET 请求和一些 POST(但目前不发送任何 PUT、UPDATE、DELETE 或 OPTION)。我知道“Access-Control-Allow-Origin”的“*”值对于生产是危险的,但我刚刚打开它进行测试。

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
.
.
.
// response.addHeader("Access-Control-Allow-Origin",
request.getHeader("Origin")); // is this correct?
response.addHeader("Access-Control-Allow-Origin", "*");
response.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, UPDATE, OPTIONS, DELETE");
response.addHeader("Access-Control-Max-Age", "3600");
response.addHeader("Access-Control-Allow-Headers",
"Content-Type, Authorization, Content-Length, X-Requested-With");
response.addHeader("Access-Control-Allow-Credentials", "true");
response.addHeader("Cache-Control", "private, max-age=0, must-revalidate");
response.addHeader("Pragma", "public");
.
.
.
}
.
.
.
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
doGet(request, response);
}

包含 servlet 的 Java 文件称为 TestServer.java;包名是 TestServer。

配置信息

Tomcat目录结构(Linux/Centos)是:

var
lib
tomcat
webapps
TestServer
TestServer.war
WEB-INF
web.xml
META-INF
context.xml

context.xml 包含以下内容:

<?xml version="1.0" encoding="UTF-8"?> 
<Context path="/TestServer"/>

web.xml 文件包含以下内容:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
<servlet>
<servlet-name>TestServer</servlet-name>
<servlet-class> TestServer. TestServer </servlet-class>
<display-name>Test System</display-name>
<init-param>
<param-name>loginName</param-name>
<param-value>#####</param-value> Note: I’ve obscured the LoginName
</init-param>
<init-param>
<param-name>connectionPWD</param-name>
<param-value>#####</param-value> Note: I’ve obscured the connectionPWD
</init-param>
<init-param>
<param-name>dbURL</param-name>
<!--param-value>localhost/</param-value-->
<!--param-value>jdbc:mysql://localhost:3306/</param-value-->
<param-value>jdbc:mysql://127.0.0.1:3306/</param-value>
</init-param>
<init-param>
<param-name>dbName</param-name>
<param-value>#####</param-value> Note: I’ve obscured the dbName
</init-param>
<init-param>
<param-name>debugging</param-name>
<param-value>on</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>TestServer</servlet-name>
<url-pattern>/ TestServer</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
</web-app>

结果

当我尝试在我的本地系统上加载这些网页之一时,我在 Firefox 控制台中收到以下错误报告(在 Chrome 和 Opera 中也会发生同样的情况):

跨源请求被阻止:同源策略不允许读取位于 http://testsite.com/TestServer/TestServer?autoReconnect=true&useSSL=false&cmd=310&tbl=1130 的远程资源. (原因:缺少 CORS header “Access-Control-Allow-Origin”)。

如果代码正确执行,我的网络浏览器中的一个 SELECT 框将显示状态列表。但是,当然,由于 CORS 错误,我没有得到任何填充。任何帮助将不胜感激!

最佳答案

我之前遇到过这个问题,基本上从 javascript 代码中,您不允许创建将 ContentType 设置为 application/json 到后端 servlet 的请求。

从 javascript/网站到后端请求的内容类型:

  1. 应用程序/x-www-form-urlencoded
  2. 多部分/表单数据
  3. 文本/纯文本

所以简而言之,将您的 Javascript CORS Content-Type 更改为这 3 个之一。

这里有更多关于它的信息https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Headers#Directives

Note that certain headers are always allowed: Accept, Accept-Language, Content-Language, Content-Type (but only with a MIME type of its parsed value (ignoring parameters) of either application/x-www-form-urlencoded, multipart/form-data, or text/plain). These are called the simple headers, and you don't need to specify them explicitly.

关于javascript - 为什么即使在设置 "esponse.addHeader("Access-Control-Allow-Origin", "*");"在 servlet 中,CORS 请求也会失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56226256/

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