我正在尝试从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始终为“ null”。从一个简单的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错误。
有什么想法吗?
答案 0 :(得分:0)
之前指出的行为是因为浏览器。它需要来自服务器的有效CORS标头,因此需要使用--disable-web-security启动Chrome来绕过和测试。还要指出,我浪费了时间,因为服务器错误是“ 404未找到”,而不是禁止的或其他...
我也了解powershell cmdlet invoke-webrequest完全不受CORS限制。