response.addHeader("Content-disposition","attachment;filename=" + filename + &qu
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了response.addHeader("Content-disposition","attachment;filename=" + filename + &qu相关的知识,希望对你有一定的参考价值。
请问这句话如果写在html页面上应该怎么写,写在哪个位置?
参考技术A 这是写在asp里的,不是html。 参考技术B 应该是不行的。为啥即使在设置“response.addHeader("Access-Control-Allow-Origin", "*");" 之后 CORS 请求
【中文标题】为啥即使在设置“response.addHeader("Access-Control-Allow-Origin", "*");" 之后 CORS 请求也会失败在小服务程序中?【英文标题】:Why is CORS request failing even after setting "esponse.addHeader("Access-Control-Allow-Origin", "*");" in servlet?为什么即使在设置“response.addHeader("Access-Control-Allow-Origin", "*");" 之后 CORS 请求也会失败在小服务程序中? 【发布时间】:2019-10-07 03:18:33 【问题描述】:我有一个关于在云服务器上运行的 Tomcat 托管 servlet 的问题。
我有一个网络应用程序,包括(此时):
• 一个文件夹中有 13 个 HTML 文件
• 名为“css”的子文件夹中的单独 CSS 文件
• 一个单独的 Javascript (JS) 文件,位于名为“js”的子文件夹中,其中包含许多库函数,包括 CORS 请求函数
• 打包在 WAR 文件中的 Java servlet
• web.xml 文件
• MySQL 数据库
我使用 NetBeans(WildFly 作为 Web 服务器)、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 代码的开头,我根据我在各个论坛上看到的帖子设置响应标头值。我实际上只发送 [大部分] 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 标头“Access-Control-Allow-Origin”)。
如果代码正确执行,我的网络浏览器中的一个 SELECT 框将显示状态列表。但是,当然,由于 CORS 错误,我没有得到任何填充。任何帮助将不胜感激!
【问题讨论】:
这段代码看起来不错,但是您在云上的访问级别是多少? @SteveParis 我是管理员,拥有完全访问权限。 我意识到我加载了错误的 context.xml 文件;正确的代码是:我之前遇到过这个问题,基本上你不能从 javascript 代码中创建一个 ContentType 设置为 application/json 到后端 servlet 的请求。
从 javascript/网站到后端接受请求的内容类型:
-
application/x-www-form-urlencoded
多部分/表单数据
文本/纯文本
因此,简而言之,将您的 Javascript CORS Content-Type 更改为这 3 种之一。
这里有更多关于它的信息https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Headers#Directives
请注意,始终允许某些标头:Accept、Accept-Language、Content-Language、Content-Type(但仅限于 MIME 其解析值的类型(忽略参数) application/x-www-form-urlencoded、multipart/form-data 或 文本/纯文本)。这些称为简单标题,您不需要 明确指定它们。
【讨论】:
感谢您提供的信息 - 我进行了更改。但是,仍然有一些奇怪的事情发生。我收到一个错误:“加载资源失败:服务器响应状态为 404(未找到)” 云托管公司提供的云服务器自带NGINX和Apache;我刚刚安装了香草Tomcat。我相信可能存在端口冲突或路径错误。我根本不了解 NGINX,而且我对 Apache+Tomcat 的熟悉程度不如我对 WildFly 的熟悉。我该如何检查?以上是关于response.addHeader("Content-disposition","attachment;filename=" + filename + &qu的主要内容,如果未能解决你的问题,请参考以下文章
Response.AddHeader("content-disposition", "attachment; filename=MyExcelFile.xls"
response.addHeader("Content-disposition","attachment;filename=" + filename + &qu
解决response.AddHeader("Content-Disposition", "attachment; fileName=" + fileNam(示例