我的网络服务器出现问题,内容来自Mozilla Firefox浏览器。我正在尝试弄清楚我必须对网页配置做些什么才能使其与Chrome或MSIE11浏览器的行为相同。 我有一个正确设置其标题的网页:
<html>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
在文本字段中,我可以粘贴“高位”文本。我选择的测试字符串是
ƉǮ…Ł
这是(带有斜线的大写字母D),(带有标记的三字形字符),省略号和(带斜角斜线的大写字母L)。它是UTF-16格式。
然后我将其提交给服务器。这是Mozilla请求标题:
POST /portal/SalesOrderServlet HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:26.0) Gecko/20100101 Firefox/26.0
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
Referer: http://localhost:8080/portal/salesOrderEdit.jsp?sequence=1508667&req=r88a_3414
Content-Length: 21321
Cookie: JSESSIONID=8283746DD2158665EADD586BFC9B6250
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
以下是Chrome请求标头:
POST /portal/SalesOrderServlet HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Content-Length: 21320
Accept: application/json, text/javascript, */*; q=0.01
Origin: http://localhost:8080
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Referer: http://localhost:8080/portal/salesOrderEdit.jsp?sequence=1508667&req=r88a_3414
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Cookie: JSESSIONID=BECCA9297706D45011D67DF82498FD66
数据以JSON格式通过AJAX调用发送到服务器。认真编辑,对于Firefox和Chrome来说都是这样的:
jsonContent:[{"name":"formData","value":"{\"hold_ae_question\":false, [snip] \"op_notes\":\"Ð?…L\", [snip] }"}]
在服务器上(Tomcat,使用Java 5版本),我从请求中提取数据:
HaloJsonObject ajaxCall = JSONUtilities.jsonify(request);
String strContent = ajaxCall.getString("jsonContent");
HaloJsonObject jsonContent = JSONUtilities.createHaloJsonObjectFromString(strContent);
“HaloJsonObject”是JSONObject的瘦包装器。这里包括了支持功能,因为无论如何我都会被问及:
public static HaloJsonObject jsonify(HttpServletRequest request) {
Enumeration<String> enums = request.getParameterNames();
JSONObject json = new JSONObject();
while(enums.hasMoreElements()) {
String paramName = enums.nextElement();
String paramValue = request.getParameter(paramName);
try {
json.put(paramName, paramValue);
} catch (JSONException e) {
// log stuff
}
}
return new HaloJsonObject(json, JSONObject.getNames(json));
}
public static HaloJsonObject createHaloJsonObjectFromString(String source) {
return convertFormArrayToObject(HaloJsonArray.createJsonArrayFromString(source));
}
public static HaloJsonObject convertFormArrayToObject(JSONArray formDataArray) {
HaloJsonObject json = new HaloJsonObject();
for(int i = 0; i < formDataArray.length(); i++) {
JSONObject jo = new JSONObject();
try {
jo = formDataArray.getJSONObject(i);
json.put(jo.getString("name"), jo.getString("value"));
} catch (JSONException e) {
// log stuff
}
}
return json;
}
public static JSONArray createJsonArrayFromString(String array) {
JSONArray json = null;
try {
json = new JSONArray(array);
} catch (JSONException e) {
json = new JSONArray();
}
return json;
}
一旦将数据解析为“jsonContent”,Eclipse调试器就会以这种方式显示:
来自Firefox时,它看起来像:
Ð?…L
来自Chrome时,它看起来像:
Æ\u0089Ç®â\u0080¦Å\u0081
或
Æ?Ç®â?¦Å
取决于您获取值的位置以及toString()如何处理它。表示形式是字符串的UTF-8值。
这对我来说是一场灾难,因为我的JDBC连接器讨厌UTF-16格式。
为什么看似相同的通话,一个来自Chrome,另一个来自Firefox,会产生不同的结果?
谢谢, 杰罗姆。
答案 0 :(得分:1)
我认为这是一种误解。我没有显式调用jQuery的$ .ajaxSetup(),jQuery文档说$ .ajax()的contentType的默认值是“application / x-www-form-urlencoded; charset = UTF-8”。但是,如果没有明确设置,Firefox浏览器将具有UTF-8子句,而Chrome浏览器则不会。
当我在$ .ajax()调用中明确地使用UTF-8设置contentType时,我看到两种浏览器的相同行为,以前的Firefox行为。顺便提一下,虽然数据传输是UTF-8,但在服务器中,数据字段用UTF-16值填充。从那里我将不得不安排将数据保存到数据库中,可能是将它们转换为UTF-8。
感谢你的外表。 杰罗姆。