MS Edge 在 ajax 请求中发送一个包含错误字符的字段。如何省略?
MS Edge sending one field in ajax request with bad characters ‎. How to omit?
我正在为 jQuery 使用时间和日期控制器插件:http://jonthornton.github.com/jquery-timepicker/
在网页的表单中,日期和时间选择器的默认值被组合成一个日期时间字符串,并与 Ajax 请求一起发送到 [=76] 上的 servlet =] 8 服务器 运行 在 Red Hat Enterprise Linux.
在 Chrome 中,这按预期工作 - 所有 JSON 文本都按预期接收。
使用 MS Edge(IE 不存在此问题)时,返回的字符带有垃圾字符:每个字符之前的字符。根据在线参考,这似乎是倒引号字符。
示例:
"timeReported":"‎6‎/‎22‎/‎2017 ‎10‎:‎29‎:‎09‎ ‎AM","description":"whatthewhat"
提交的JSON其他字段都可以,上面的描述只是一个例子。
我用 Javascript:
的位填充表单上的字段
$('#TimeReported .time').timepicker({
'showDuration': true,
'timeFormat': 'g:ia',
'step': 5
});
$('#TimeReported .date').datepicker({
'format': 'mm/dd/yyyy',
'autoclose': true
});
并像这样从输入中读取值:
// joined to avoid any problems with unary + which may take some values as numbers
var timeelements= [
String($('#TimeReported .date').val()),
String($('#TimeReported .time').val())
];
var issueTimeReported=timeelements.join(' ');
从 IE 导出并放入 json 记录调试的值:
"6/22/2017 1:00:51 PM"
数据通过 jQuery 作为 JSON 提交,具有以下选项:
type : "POST",
url : "submitForm.page",
async: true,
dataType: 'json',
contentType: 'application/json;charset=Windows-1252',
processData: false,
data : JSON.stringify(rdata),
稍微读了一下,我发现这通常是编码错位,其中 utf-8 或 ISO-whatever 与 Windows-1252 冲突。
我还注意到 Edge 中的调试控制台报告 HTTP header 并且该页面正在发送冲突的编码,因此我删除了所有页面特定的编码并在 web.xml 上应用了过滤器 tomcat 强制一切为 Windows-1252.
<!-- A filter that sets character encoding that is used to decode -->
<!-- parameters in a POST request -->
<filter>
<filter-name>setCharacterEncodingFilter</filter-name>
<filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>Windows-1252</param-value>
</init-param>
<async-supported>true</async-supported>
</filter>
<!-- The mapping for the Set Character Encoding Filter -->
<filter-mapping>
<filter-name>setCharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
这似乎已经解决了编码冲突的警告,但在服务器上收到的结果仍然是一样的。有效的文档类型是 X-UA-Compatible(通过元标记)。
<meta http-equiv="X-UA-Compatible" content="IE=edge">
我想阻止这些字符从浏览器发送,但如果有必要,我可以在 servlet 中明确地过滤它们。看来问题出在IE后台,提交Ajax请求,和Tomcat之间,我觉得不是在Tomcat这边
我已经解决了这个问题,方法是捕获我的代码在尝试摄取此数据时抛出的日期解析异常并提供合适的替代品(它只使用控件的默认值,即 "now",所以我们用 "now" 服务器端代替。)
但是这不是答案。从控件中选择值的事实绕过了这个问题,例如不是默认值,表明我正在使用的 jQuery 时间和日期选择器插件可能有问题。
我们已经提交了关于插件的问题。此时所有测试都指向控件初始化的方式。 https://github.com/jonthornton/jquery-timepicker/issues/624
由于 ajax 请求和接收系统上的字符集不匹配,此问题通常出现在 Web 开发中。问题中尝试的所有内容通常都会解决此问题,即确保在 SetCharacterEncodingFilter 中按预期设置的字符集与传入 Web 请求 contentType 中提供的匹配。
在此特定实例中,问题出在第三方插件中,因此没有针对此特定问题的具体解决方案,但根本问题是可以解决和纠正的。
我正在为 jQuery 使用时间和日期控制器插件:http://jonthornton.github.com/jquery-timepicker/
在网页的表单中,日期和时间选择器的默认值被组合成一个日期时间字符串,并与 Ajax 请求一起发送到 [=76] 上的 servlet =] 8 服务器 运行 在 Red Hat Enterprise Linux.
在 Chrome 中,这按预期工作 - 所有 JSON 文本都按预期接收。
使用 MS Edge(IE 不存在此问题)时,返回的字符带有垃圾字符:每个字符之前的字符。根据在线参考,这似乎是倒引号字符。
示例:
"timeReported":"‎6‎/‎22‎/‎2017 ‎10‎:‎29‎:‎09‎ ‎AM","description":"whatthewhat"
提交的JSON其他字段都可以,上面的描述只是一个例子。
我用 Javascript:
的位填充表单上的字段$('#TimeReported .time').timepicker({
'showDuration': true,
'timeFormat': 'g:ia',
'step': 5
});
$('#TimeReported .date').datepicker({
'format': 'mm/dd/yyyy',
'autoclose': true
});
并像这样从输入中读取值:
// joined to avoid any problems with unary + which may take some values as numbers
var timeelements= [
String($('#TimeReported .date').val()),
String($('#TimeReported .time').val())
];
var issueTimeReported=timeelements.join(' ');
从 IE 导出并放入 json 记录调试的值:
"6/22/2017 1:00:51 PM"
数据通过 jQuery 作为 JSON 提交,具有以下选项:
type : "POST",
url : "submitForm.page",
async: true,
dataType: 'json',
contentType: 'application/json;charset=Windows-1252',
processData: false,
data : JSON.stringify(rdata),
稍微读了一下,我发现这通常是编码错位,其中 utf-8 或 ISO-whatever 与 Windows-1252 冲突。
我还注意到 Edge 中的调试控制台报告 HTTP header 并且该页面正在发送冲突的编码,因此我删除了所有页面特定的编码并在 web.xml 上应用了过滤器 tomcat 强制一切为 Windows-1252.
<!-- A filter that sets character encoding that is used to decode -->
<!-- parameters in a POST request -->
<filter>
<filter-name>setCharacterEncodingFilter</filter-name>
<filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>Windows-1252</param-value>
</init-param>
<async-supported>true</async-supported>
</filter>
<!-- The mapping for the Set Character Encoding Filter -->
<filter-mapping>
<filter-name>setCharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
这似乎已经解决了编码冲突的警告,但在服务器上收到的结果仍然是一样的。有效的文档类型是 X-UA-Compatible(通过元标记)。
<meta http-equiv="X-UA-Compatible" content="IE=edge">
我想阻止这些字符从浏览器发送,但如果有必要,我可以在 servlet 中明确地过滤它们。看来问题出在IE后台,提交Ajax请求,和Tomcat之间,我觉得不是在Tomcat这边
我已经解决了这个问题,方法是捕获我的代码在尝试摄取此数据时抛出的日期解析异常并提供合适的替代品(它只使用控件的默认值,即 "now",所以我们用 "now" 服务器端代替。)
但是这不是答案。从控件中选择值的事实绕过了这个问题,例如不是默认值,表明我正在使用的 jQuery 时间和日期选择器插件可能有问题。
我们已经提交了关于插件的问题。此时所有测试都指向控件初始化的方式。 https://github.com/jonthornton/jquery-timepicker/issues/624
由于 ajax 请求和接收系统上的字符集不匹配,此问题通常出现在 Web 开发中。问题中尝试的所有内容通常都会解决此问题,即确保在 SetCharacterEncodingFilter 中按预期设置的字符集与传入 Web 请求 contentType 中提供的匹配。
在此特定实例中,问题出在第三方插件中,因此没有针对此特定问题的具体解决方案,但根本问题是可以解决和纠正的。