Web 服务器上的请求筛选被配置为拒绝该请求,因为查询字符串过长
eg:
var selectArr = [];
for (var i = 0; i < 300; i++) {
selectArr.push(“78946565885555”);
}
var arr = selectArr || {};
url: 'url?arr=' + arr.toString(),
ajax传参时候会导致报异常:
Web 服务器上的请求筛选被配置为拒绝该请求,因为查询字符串过长
等类似信息。
解决方案:
1、确认 applicationhost.config 或 web.config 文件中的 configuration/system.webServer/security/requestFiltering/requestLimits@maxQueryString 设置。
<system.web>
<compilation targetFramework="4.5.2" />
<httpRuntime targetFramework="4.5.2" maxRequestLength="102400" maxQueryStringLength="102400"/>
</system.web>
来自MSDN解释:
httpRuntime是配置asp.net http运行时设置,以确定如何处理对asp.net应用程序的请求。
executionTimeout:表示允许执行请求的最大时间限制,单位为秒
maxRequestLength:指示 ASP.NET 支持的最大文件上载大小。该限制可用于防止因用户将大量文件传递到该服务器而导致的拒绝服务攻击。指定的大小以 KB 为单位。默认值为 4096 KB (4 MB)。
useFullyQualifiedRedirectUrl:表示指示客户端重定向是否是完全限定的(采用 "http://server/path" 格式,这是某些移动控件所必需的),或者指示是否代之以将相对重定向发送到客户端。如果为 True,则所有不是完全限定的重定向都将自动转换为完全限定的格式。false 是默认选项。
minFreeThreads:表示指定允许执行新请求的自由线程的最小数目。ASP.NET 为要求附加线程来完成其处理的请求而使指定数目的线程保持自由状态。默认值为 8。
minLocalRequestFreeThreads:表示ASP.NET 保持的允许执行新本地请求的自由线程的最小数目。该线程数目是为从本地主机传入的请求而保留的,以防某些请求在其处理期间发出对本地主机的子请求。这避免了可能的因递归重新进入 Web 服务器而导致的死锁。
appRequestQueueLimit:表示ASP.NET 将为应用程序排队的请求的最大数目。当没有足够的自由线程来处理请求时,将对请求进行排队。当队列超出了该设置中指定的限制时,将通过“503 - 服务器太忙”错误信息拒绝传入的请求。
enableVersionHeader:表示指定 ASP.NET 是否应输出版本标头。Microsoft Visual Studio 2005 使用该属性来确定当前使用的 ASP.NET 版本。对于生产环境,该属性不是必需的,可以禁用。
2、以数组方式传参,如
方法一:
var arr={params:['param','param2']};
url: 'url?arr=' + arr.toString(),
post方式时
$.ajax({url:请求地址, data:arr, type:"POST", success:function(){ //do something } });
方法二:ajax提交添加”traditional:true”参数
traditional:是否使用传统的方式浅层序列化。
数组或jQuery对象会按照name/value对进行序列化,普通对象按照key/value对进行序列化。
var arr=new Array(); arr[0]='param'; arr[1]='param2'; $.ajax({url:请求地址, data:{params:arr}, type:"POST", traditional:true, //默认false success:function(){ //do something } });
通过ajax提交数组时,会自动在所设定的参数后面增加中括号:“[]”,导致后端spring MVC中的@RequestParam获取不到参数。
解决方法:
ajax请求时增加:traditional: true 就可以正常提交了。原因如下:
jQuery会调用jQuery.param序列化参数,jQuery.param( obj, traditional ),默认的话,traditional为false,即jquery会深度序列化参数对象,以适应如PHP和Ruby on Rails框架,但servelt api无法处理,我们可以通过设置traditional 为true阻止深度序列化。