这是我检索项目的Javascript代码是SharePoint 2010(SP)列表。
var clientContextPath = "/path/site1";
var clientContext = new SP.ClientContext(clientContextPath);
var oList = clientContext.get_web().get_lists().getByTitle(list);
var camlQuery = new SP.CamlQuery();
...
但是,如果我想从其他网站检索,即
var clientContextPath = "/path/site2";
然后相同的代码生成异常“此页面的安全验证无效”。这是在同一个域内,所以它与XSS无关。
有趣的是,当我使用其他网站时,相同的代码工作正常
var clientContextPath = "/path/site3";
请帮忙。谢谢。
答案 0 :(得分:1)
确保您运行javascript的页面具有此控件:
<SharePoint:FormDigest runat="server" />
FormDigest根据用户,网站和时间在您的网页中添加安全令牌。页面回发后,安全令牌将得到验证。一旦生成安全令牌,它就会在可配置的时间内有效。
http://ranaictiu-technicalblog.blogspot.com.au/2010/02/sharepoint-2010-client-object-model-for.html
更新:如果以上操作不起作用,请在执行查询之前尝试此操作:
function CustomUpdateFormDigest()
{
if(window._spPageContextInfo != null)
{
var $v_2 = window._spPageContextInfo;
var $v_3 = $v_2.webServerRelativeUrl;
var $v_4 = window._spFormDigestRefreshInterval;
UpdateFormDigest($v_3, $v_4);
}
}
CustomUpdateFormDigest();
当我唯一的选择是关闭页面验证时,这对我有用。
更新2:
好像你可能遇到了一个分享点错误。也许尝试通过累积更新,或作为最后的手段关闭页面验证,只需确保您了解此选项的安全隐患
答案 1 :(得分:1)
我刚试过这个解决方案,我确信它不会起作用,但是......确实如此!基本上,这是从SharePoint收集新令牌的Ajax请求。
$.ajax({
url: projecturl + "/_api/contextinfo",
method: "POST",
headers: { "Accept": "application/json; odata=verbose"},
success: function (data) {
$('#__REQUESTDIGEST').val(data.d.GetContextWebInformation.FormDigestValue);
EnsureScriptFunc('sharing.js', 'DisplaySharingDialog', function () { DisplaySharingDialog(projecturl) });
},
error: function (data, errorCode, errorMessage) {
alert(errorMessage)
}
});
答案 2 :(得分:0)
更简单的方法
UpdateFormDigest(_spPageContextInfo.webServerRelativeUrl, _spFormDigestRefreshInterval)
这是本机方法,是共享点。只需在调用ajax请求或executeQueryAsync()之前添加此方法即可。
来源:http://www.wictorwilen.se/sharepoint-2013-how-to-refresh-the-request-digest-value-in-javascript