前端交互问题集

  • 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),客户端告诉服务器实际发送的数据类型。

猜你喜欢

转载自blog.csdn.net/weixin_38927996/article/details/88344965