我正在使用Spring,并尝试在 Controller 中对@ResponseBody进行ajax调用。
更新
好的,我将告诉我的更改添加到了我的ajax设置中。
我的参数“jtSearchParam”在IE中仍然有相同的编码问题。
+我收到另一个错误406,响应 header 的内容类型错误。
这是我的新代码
Controller :
@RequestMapping(method = RequestMethod.POST, consumes="application/json; charset=utf-8", produces="application/json; charset=utf-8")
public @ResponseBody JSONObject getUsers(@RequestParam int jtStartIndex, @RequestParam int jtPageSize,
@RequestParam String jtSorting, @RequestParam String jtSearchParam,
HttpServletRequest request, HttpServletResponse response) throws JSONException{
Gson gson = new GsonBuilder()
.setExclusionStrategies(new UserExclusionStrategy())
.create();
List<User> users = userService.findUsers(jtStartIndex ,jtPageSize, jtSorting, jtSearchParam);
Type userListType = new TypeToken<List<User>>() {}.getType();
String usersJsonString = gson.toJson(users, userListType);
int totalRecordCount = userDao.getAmountOfRows(jtSearchParam);
usersJsonString = "{\"Message\":null,\"Result\":\"OK\",\"Records\":" + usersJsonString + ",\"TotalRecordCount\":" + totalRecordCount + "}";
JSONObject usersJsonObject = new JSONObject(usersJsonString);
return usersJsonObject;
}
因此,如您所见,我在
produces
中设置了内容类型,但这无济于事。如果我调试响应头,它看起来像这样:
(这会导致浏览器不接受406)
而我的新ajax设置:
...
headers: {
Accept : "application/json; charset=utf-8",
"Content-Type": "application/json; charset=utf-8"
},
contentType: "application/json; charset=utf-8",
mimeType:"application/json; charset=UTF-8",
cache:false,
type: 'POST',
dataType: 'json'
...
而且我的参数在IE中看起来还是一样!
最佳答案
好的json content-type的问题可以这样解决:
使用ResponseEntity,您可以更改响应 header 的内容类型,这样ajax可以正确地解释json对象,并且不会收到406 Http错误。
@RequestMapping(method = RequestMethod.POST)
public ResponseEntity<String> getUsers(@RequestParam int jtStartIndex, @RequestParam int jtPageSize,
@RequestParam String jtSorting, @RequestParam String jtSearchParam,
HttpServletRequest request, HttpServletResponse response) throws JSONException{
HttpHeaders responseHeaders = new HttpHeaders();
responseHeaders.add("Content-Type", "application/json; charset=utf-8");
Gson gson = new GsonBuilder()
.setExclusionStrategies(new UserExclusionStrategy())
.create();
List<User> users = userService.findUsers(jtStartIndex ,jtPageSize, jtSorting, jtSearchParam);
Type userListType = new TypeToken<List<User>>() {}.getType();
String usersJsonString = gson.toJson(users, userListType);
int totalRecordCount = userDao.getAmountOfRows(jtSearchParam);
usersJsonString = "{\"Message\":null,\"Result\":\"OK\",\"Records\":" + usersJsonString + ",\"TotalRecordCount\":" + totalRecordCount + "}";
return new ResponseEntity<String>(usersJsonString, responseHeaders, HttpStatus.OK);
}
编码问题可以这样解决:
IE不会对您的“ü,ä等”进行编码。正确地,它只是将其添加到您的URL中,如下所示:“jtSearchParam =wü”,但实际上应如下所示:“jtSearchParam = w%C3%BC”(如果不正确,则会出现编码错误使用IE时在服务器端)
因此,在将某些值添加到URL的任何地方,请确保对该值使用JavaScript方法
encodeURI
,然后再将其实际添加到URL中。例子:
encodeURI(jtSearchParam)