- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个关于在云服务器上运行的 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 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();
}
在服务器端,在 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/网站到后端请求的内容类型:
所以简而言之,将您的 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/
我尝试访问此 API click here for more info POST https://api.line.me/v2/oauth/accessToken 但总是得到错误: XMLHttpRe
我在掌握 CORS 概念时遇到问题... 我认为同源策略保护应用程序不会对“不受信任的域”进行 ajax 调用。所以, mydomain.com 向 发出 ajax 调用somedomain.com
一个技术性很强的问题,可能只有了解浏览器内部结构的人才能回答...... 浏览器缓存 CORS 预检响应的准确程度如何(假设在对 OPTIONS 预检请求的响应中返回了 Access-Control-
我一直在阅读 CORS以及它是如何工作的,但我发现很多事情令人困惑。例如,有很多关于事情的细节,比如 User Joe is using browser BrowserX to get data fr
在 OWASP site 上看到这个矛盾,我感到很困惑。 CORS 备忘单: 使用 Access-Control-Allow-Credentials: true 响应 header 时要特别小心。将允
我们无法在飞行前恢复使用 cors:任何帮助都非常感谢 ==========错误========================== About to connect() to localhost p
跨域请求字体文件时,您必须确保允许请求域使用 CORS header 访问字体文件: 访问控制允许来源 访问控制允许凭据 然而,这在请求图像时不是必需的,无论是对于 img元素或 background
CORS 规范没有说明服务器应如何响应无效的 CORS 请求。例如,如果请求 Origin 无效,则 CORS spec states :“终止这组步骤。请求超出了本规范的范围。”其他错误情况也有类似
我在理解同源策略和“解决”它的不同方法时遇到了一些麻烦。 很明显,同源策略是作为一种安全措施而存在的,因此来自服务器/域的一个脚本无法访问来自另一个服务器/域的数据。 也很明显,有时能够打破此规则很有
我正在尝试使用 cloudformation 在 API Gateway 中部署 API。这些方法需要启用 CORS,我遵循此处的模板 Enable CORS for API Gateway in C
我正在构建一个使用 CORS 的 REST 应用程序。每个 REST 调用都是不同的,我发现获取预检 OPTIONS 调用会产生很大的开销。有没有办法缓存并应用预检选项结果,以便对同一域的任何后续调用
我正在将我的 WebApi 升级到 MVC6。 在 WebApi 中,我可以拦截每个 HTTP 请求,如果是预检,我可以用浏览器可以接受的 header 进行响应。 我正在尝试找出如何在 MVC6 W
假设一个 CORS 预检请求进来了,但它为一个或多个 Access-Control-Request-* 指定了一个不受支持的值。标题。服务器应该如何将其传达回浏览器? 一些例子: 浏览器发送带有 Ac
问题中的一切。 附加信息: 使用 Win 10,GraphDB 免费,9.1.1 • RDF4J 3.0.1 • Connectors 12.0.2 我在控制台 => 设置中添加了 graphdb.w
我正在尝试通过 jQuery 调用 Sonar 网络服务之一。由于调用是跨域进行的,因此调用在 Chrome 上失败并出现以下错误: 请求的资源上不存在“Access-Control-Allow-Or
我想使用 NestJs api,但我在每个 fetch 中都收到相同的错误消息: Access to fetch at 'http://localhost:3000/articles' from or
我不确定这是否属于这里,但我在开发我的 svelte 应用程序时遇到了问题。 在开发过程中,它目前在独立服务器上运行(遵循使用 rollup 和 sirv 的指南)并针对不同端口上的后端 API。 稍
如果在服务器上正确设置 CORS 以仅允许某些来源访问服务器,这是否足以防止 XSRF 攻击? 最佳答案 更具体地说,很容易错误地认为如果 evil.com 由于 CORS 无法向 good.com
我在 Istio 入口上启用 CORS 时遇到问题。正如 Istio Ingress 文档所述,“ingresskubernetes.io”注释将被忽略。是否可以在 Istio 入口上启用 CORS?
我在 Istio 入口上启用 CORS 时遇到问题。正如 Istio Ingress 文档所述,“ingresskubernetes.io”注释将被忽略。是否可以在 Istio 入口上启用 CORS?
我是一名优秀的程序员,十分优秀!