【问题标题】:XMLhttprequest gets '404 not found' but invoke-webrequest runs fineXMLhttprequest 得到 '404 not found' 但 invoke-webrequest 运行良好
【发布时间】:2019-05-01 22:08:24
【问题描述】:

我正在尝试从 javascript 代码运行 Citrix 应用程序。我有一个适用于 powershell 的示例,只显示第一次调用:

#Gets required tokens
$headers = @{
"Accept"='application/xml, text/xml, */*; q=0.01';
"Content-Length"="0";
"X-Requested-With"="XMLHttpRequest";
"X-Citrix-IsUsingHTTPS"="Yes";
"Referer"=$sfurl;
}

Invoke-WebRequest -Uri ($sfurl + "Home/Configuration") -Method POST -Headers $headers -WebSession $sfsession|Out-Null

$csrf = $sfsession.cookies.GetCookies($sfurl)|where{$_.name -like "CsrfToken"}
$cookiedomain = $csrf.Domain
write-host $csrf.Domain

那段代码工作正常,我们可以看到 citrix 服务器提供的值,但如果我将其转换为 javascript,我只会收到错误“404 Not Found”。一段Javascript代码也很简单:

function starticaurl (authurl, whatapp) {
    var csrf = getCookie("CsrfToken");
    var xhr = new XMLHttpRequest();

    xhr.open("POST", (authurl + "Home/Configuration"), true);

    xhr.setRequestHeader("Accept", "application/xml, text/xml, */*; q=0.01");
    //xhr.setRequestHeader("Content-Length","0");
    xhr.setRequestHeader("X-Citrix-IsUsingHTTPS","Yes");
    //xhr.setRequestHeader("Referer",authurl);
    xhr.setRequestHeader('Csrf-Token',csrf);
    xhr.setRequestHeader("Access-Control-Allow-Origin","*");

    xhr.onreadystatechange = function () {
        // do something to response
        console.log(this.responseText);
    };

    xhr.send();

    console.log("Got: " + csrf);

csrf 始终为“空”。这个函数是从一个简单的 html 调用的:

<!DOCTYPE html>
<html>    
<head>    
    <meta http-equiv="Content-type" content="text/html;charset=UTF-8"/>     
</head> 

<body>    
    <h1>ICA Launcher</h1>
    <script src="createica.js"></script>

    <button onclick="starticaurl('https://citrix.mycompany.com/Citrix/TestWeb/', 'Notepad')">Launch App</button>
</body>    
</html>

我不明白为什么当从 powerhell 相同的 URL 工作正常时浏览器总是返回这个 404 错误。

有什么想法吗?

【问题讨论】:

  • 您在发帖前尝试获取 cookie。您应该发布然后获取 cookie
  • 是的,我认为你是对的,但我认为这个问题稍后会出现。对我来说,根本原因来自浏览器本身。我想了解的是为什么使用invoke-webrequest cmdlet 从PowerShell 发出相同的请求,但无法通过this javascript 调用运行。
  • 当您运行 Powershell 命令时,您没有浏览器限制。如果您想避免这种情况并仍然使用 javascript,则需要创建 Node.js 服务器并从那里发布请求。

标签: javascript xmlhttprequest citrix


【解决方案1】:

如前所述,行为是因为浏览器。它需要来自服务器的有效 CORS 标头,因此需要使用 --disable-web-security 启动 Chrome 以绕过和测试。还要指出我浪费了时间,因为服务器错误是'404 Not found'而不是禁止或其他......

我也了解 powershell cmdlet invoke-webrequest 根本不受 CORS 限制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2018-08-30
    • 2019-06-16
    • 1970-01-01
    相关资源
    最近更新 更多