在ASP.NET MVC项目中,使用AJAX向控制器发送GET请求获取JSON数据时,出现这个错误:"此请求已被阻止,因为当用在 GET 请求中时,会将敏感信息透漏给第三方网站。若要允许 GET 请求,请将 JsonRequestBehavior 设置为 AllowGet"。

其实从返回的这个错误信息我们已经可以知道解决方法了,看这个信息:”因为当用在 GET 请求中时,会将敏感信息透漏给第三方网站“,说明我们只要使用POST请求就可以了。后面的 “若要允许 GET 请求,请将 JsonRequestBehavior 设置为 AllowGet”,这是提示第二种解决方法,就是设置JSON结果对象使其允许来自客户端的 HTTP GET 请求。以下为具体解决方法:

方法一 使用POST请求来调用控制器,从而获取JSON数据

原来发送ajax请求的前台JS代码如下:

/*可以看到type 设置的是GET请求*/
$.ajax({
type:'GET',
url: '/Home/AjaxGetJsonData',
success: function (data) {
alert(data);
},
error: function (error) {
alert(error.responseText);
}
});

或者

 $.get('/Home/AjaxGetJsonData', null, function (data) {
alert(data);
});

那么我们只要将代码更改为下面两种任意一种就可以了:

 /*这里更改了ajax的参数 type 为POST ,发送POST请求就不会报错了*/
$.ajax({
type: 'POST',
url: '/Home/AjaxGetJsonData',
success: function (data) {
alert(data);
},
error: function (error) {
alert(error.responseText);
}
});

或者

 /*也可以直接使用$.post方法进行ajax调用*/
$.post('/Home/AjaxGetJsonData', null, function (data) {
alert(data);
});

方法二 在控制器返回的JSON结果对象里,设置JsonRequestBehavior.AllowGet(允许来自客户端的 HTTP GET 请求)

原来控制器中的代码如下:

public ActionResult AjaxGetJsonData()
{
string strData = "测试数据";
return Json(strData);
}

更改后的代码如下 :

 public ActionResult AjaxGetJsonData()
{
string strData = "测试数据";
//这里我们设置了第二个参数JsonRequestBehavior为AllowGet
return Json(strData,JsonRequestBehavior.AllowGet);
}

我们可以看到在最后return Json(list, JsonRequestBehavior.AllowGet)中增加了第二个参数JsonRequestBehavior.AllowGet,默认是JsonRequestBehavior.DenyGet。之所以我们要在这里设置允许HTTP GET请求,是因为ASP.NET MVC为了预防一个网站信息泄漏的漏洞,所以默认是禁止客户端的HTTP GET 请求的。这是一个很出名的漏洞,名字是:JSON 劫持漏洞,所以我建议AJAX还是使用POST请求来获取数据,防止重要的信息被恶意攻击者窃取。

这里是MSDN文档的具体说明:允许 GET 请求可能会导致用户在某一网站中仍处于已登录状态时访问另一个网站。 这可能会生成导致信息泄漏的安全漏洞。有关此漏洞的信息,请参见 Phil Haack 的博客上的文章 JSON Hijacking,文章是英文的,我已经翻译,点击此链接:JSON劫持漏洞(详细讲解利用JSON从而进行数据劫持的漏洞攻防策略),另外还可以查看这篇文章:JSON劫持漏洞分析和攻防演练

最新文章

  1. 通过setTimeout来取消因大量计算造成的网页卡顿
  2. 第7章 权限管理(3)_文件系统属性和sudo权限
  3. linux启动流程
  4. mysql limit查询优化
  5. TCP/IP协议学习(三) STM32中ETH驱动配置注意事项
  6. iOS开发笔记系列-基础5(分类和协议)
  7. ART模式和Dalvik模式的异同
  8. Qt中OpenGL的初步使用
  9. MyReport报表引擎2.6.5.0新功能
  10. MVC验证11-对复杂类型使用jQuery异步验证
  11. Spring框架碰壁日常更新
  12. mybatis乱码
  13. app锁定屏幕方向,某一个界面支持屏幕旋转~
  14. 【微服务】.netCore eShopOnContainers 部署实践《二》
  15. Java创建文件
  16. oracle用户下查看服务器或者本地IP地址
  17. Python之socket编程进阶版
  18. shell alias添加别名使用
  19. Cannot create inner bean '(inner bean)#67f903b5' of typ
  20. 日志文件(关于#IRSA_MDPS_RDM软件 密码登录事项 7月26号)

热门文章

  1. LeetCode Same Tree (判断相同树)
  2. [转] Attach、Detach和DeleteObject
  3. [Bhatia.Matrix Analysis.Solutions to Exercises and Problems]ExI.5.8
  4. C#发送简单的HTTP POST请求给传统的ASP网页。
  5. VTK三维重建(2)-根据脚部骨骼CT的三维重建和显示
  6. STL(pair map set vector priority_queue) poj 3297
  7. volatile,可变参数,memset,内联函数,宽字符窄字符,国际化,条件编译,预处理命令,define中##和#的区别,文件缓冲,位域
  8. kvm guest usb mapping
  9. Aisino 金税盘 pass throught
  10. Android实例-程序界面内截取屏幕(XE8+小米2)