I.在使用ajax请求并接收从服务器返回处理器结果时,出现406错误\
- ajax.jsp代码如下
$.ajax({ url:"nstest/return.do",//ajax请求资源路径 //datatype:"json",传递Object类型的对象时需要指定数据类型为json,因为该种数据使用json为载体 //data:{},{name:"龙傲天",age:23},ajax请求携带参数 success:function(data){//成功返回时 /* var json=eval("("+data+")");解析json对象,除去括号 alter(json); */ alert(data); }, error: function(XMLHttpRequest, textStatus, errorThrown) { alert(XMLHttpRequest.status); alert(XMLHttpRequest.readyState); alert(textStatus); }, complete: function(XMLHttpRequest, textStatus) { this; // 调用本次AJAX请求时传递的options参数 } }); }); });
- 后台代码如下
@RequestMapping(value="/return.do",produces="text/html;charset=utf-8") @ResponseBody //将返回的数据放进响应体 public Object handleReturn() throws Exception { System.out.println("return Object"); //return 123.456; //return "北京欢迎你";//需要在@RequestMapping标签中加上produces="text/html;charset=utf-8"解决乱 码 return new student("草泥马",12,new School("gdou")); }
查询可知,406指服务器响应设置与浏览器接收设置不相兼容而造成的,而在SpringMVC中常见的主要原因有:
1、未使用jackson工具包导致数据未转换成json
2、web.xml中ServletMapping的uri匹配路径后缀设置为*.html,而spring会默认使用text/html方式封装数据导致与json不匹配,换成其他后缀即可
但并不存在以上问题,返回去看后台代码,发现produces="text/html;charset=utf-8"指定了响应类型为text/html,导致与json不相符合,因此去掉即可体会:
在学习web时应该学会使用浏览器携带的开发者工具查看请求和响应响应信息此处补上请求头和响应头基本属性概念
Multipurpose Internet Mail Extensions (MIME) type:多用途网际邮件扩展名类型,主要有四种:text/***,imag/***,audio/***,video/***,application/***,分别对应文本、图片、声音、视频、字节数据Accept:请求头用来告知客户端可以处理的内容类型,这种内容类型用MIME类型来表示。借助内容协商机制, 服务器可以从诸多备选项中选择一项进行应用,并使用 Content-Type 应答头通知客户端它的选择。浏览器会基于请求的上下文来为这个请求头设置合适的值
Accept-Encoding:会将客户端能够理解的内容编码方式——通常是某种压缩算法——进行通知。通过内容协商的方式,服务端会选择一个客户端提议的方式,使用并在响应报文首部 Content-Encoding 中通知客户端该选择。即使客户端和服务器都支持相同的压缩算法,在 identity 指令可以被接受的情况下,服务器也可以选择对响应主体不进行压缩。导致这种情况出现的两种常见的情形是:
要发送的数据已经经过压缩,再次进行压缩不会导致被传输的数据量更小。
一些图像格式的文件会存在这种情况;服务器超载,无法承受压缩需求导致的计算开销。
通常,如果服务器使用超过80%的计算能力,微软建议不要压缩。只要 identity ——表示不需要进行任何编码——没有被明确禁止使用(通过 identity;q=0 指令或是 *;q=0 而没有为 identity 明确指定权重值),则服务器禁止返回表示客户端错误的 406 Not Acceptable 响应。Accept-Language:请求头允许客户端声明它可以理解的自然语言,以及优先选择的区域方言。
Cache-Control:通用消息头被用于在http 请求和响应中通过指定指令来实现缓存机制。缓存指令是单向的, 这意味着在请求设置的指令,在响应中不一定包含相同的指令
Content-Type:实体头部用于指示资源的MIME类型 media type 。在响应中,Content-Type标头告诉客户端实际返回的内容的内容类型。浏览器会在某些情况下进行MIME查找,并不一定遵循此标题的值; 为了防止这种行为,可以将标题 X-Content-Type-Options 设置为 nosniff。在请求中 (如POST 或 PUT),客户端告诉服务器实际发送的数据类型。