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 文件;正确的代码是: 抱歉!刚开始在这个论坛上提问,我在发帖之前尝试过仔细打样! 那么你是说当你使用正确的文件内容时它现在可以工作了吗?或者,只是您在问题中输入了错误的内容,现在已经对其进行了编辑以更正问题中的不准确信息,但您仍然有问题? 不,它仍然无法正常工作。我的意思是说我刚刚将 Context.xml 的错误内容复制到了这篇文章中,但我更新了上面的列表。很抱歉造成混乱! 【参考方案1】:

我之前遇到过这个问题,基本上你不能从 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(示例

response.addHeader()没有添加

Asp.Net WEb中怎么清空缓存?

HttpServletResponse setHeader 和 addHeader区别