【Bug记录】Spring MVC Web项目中HTTP请求报406错误

首先http状态码406的意思为not acceptable,实质为HTTP请求中的的Accept请求头的属性值与HTTP响应的数据格式不一致,你给我的不是我想要的,所以浏览器这边报错了。

具体是什么导致这样的错误要分具体的情况。我暂时了解到以下两种spring mvc中项目中导致406的情况:

  1. 请求url为http://ip:port/abc/dfg格式的请求,spring mvc controller中对应的处理方法使用了@ResponseBody注解(注意@RestController注解实质是一个复合注解,包括了@Controller和@ResponseBody两个注解)。这时候要检查jar包依赖,是否Jackson包依赖是否加载正确。
  2. 后端为jsp页面做了伪静态化处理。如下配置:
<servlet-mapping>

    <servlet-name>xxServlet</servlet-name>

    <url-pattern>*.html</url-pattern>

</servlet-mapping>

 

 此时浏览器端访问的url格式为:请求url为http://ip:port/abc/dfg.html。后端处理方法仍使用了@ResponseBody注解返回json数据(@ResponseBody注解作用就是将数据以json格式形式写入响应的响应体中)。因为浏览器端使用.html后缀指明了请求内容的格式,但是服务器端却返回了json类型的数据,这是不可接受的。解决办法是多入口的spring mvc,即增加这样一个配置:

<servlet-mapping>

    <servlet-name>xxServlet</servlet-name>

    <url-pattern>*.do</url-pattern>

</servlet-mapping>

然后以.do后缀形式的url进行请求即可。我遇到406错误就是因为我配置了伪静态化,请求页面时都没出现错误,但是在ajax请求中需要返回json格式数据,请求url后缀为.html,这时候就出问题了。

引用:https://blog.csdn.net/sinat_32247833/article/details/64919695

通过这次错误了解了http协议请求方面的知识,开发时遇到http错误要注意通过浏览器调试观察http请求头,响应头等http报文数据,进行分析。并且通过这次错误,我还接触到了@RequestMapping注解中的produces属性(不但可以设置返回值类型还可以设定返回值的字符编码)和consumes属性( 指定处理请求的提交内容类型content-type),属性具体的值在MediaType这个类中。

注:为什么http://ip:port/abc/dfg格式的请求且Accept请求头为text/html可以返回json格式数据?

@RequestMapping(value = “/produces”, produces = “application/json”): 
表示将生产json格式的数据,此时根据请求头中的Accept进行匹配,如请求头“Accept:application/json”时即可匹配; 
@RequestMapping(value = “/produces”, produces = “application/xml”): 
表示将生产xml格式的数据,此时根据请求头中的Accept进行匹配,如请求头“Accept:application/xml”时即可匹配。 
此种方式相对使用@RequestMapping的“headers = “Accept=application/json””更能表明你的目的。 
当你有如下Accept头: 
①Accept:text/html,application/xml,application/json 
将按照如下顺序进行produces的匹配 ①text/html ②application/xml ③application/json 
②Accept:application/xml;q=0.5,application/json;q=0.9,text/html 
将按照如下顺序进行produces的匹配 ①text/html ②application/json ③application/xml 
q参数为媒体类型的质量因子,越大则优先权越高(从0到1) 
③Accept:/,text/*,text/html 
将按照如下顺序进行produces的匹配 ①text/html ②text/* ③/ 
即匹配规则为:最明确的优先匹配。

引用:

https://blog.csdn.net/jaryle/article/details/72965885

https://blog.csdn.net/danqiu2017/article/details/78853414

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值