【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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用Java Web技术生成一个类似于百度网站的,你可以遵循以下步骤: 1. 确保你已经安装了Java开发环境(JDK)和一个Java Web开发框架(如Spring MVC、Struts2或JavaServer Faces)以及一个服务器(如Apache Tomcat)。 2. 创建一个新的Java Web项目。可以使用你选择的开发框架提供的工具或使用IDE(如Eclipse或IntelliJ IDEA)创建一个新的Java Web项目。 3. 定义项目的结构。将项目划分为不同的模块(如前端、后端、数据库等),并创建相应的目录结构。 4. 设计和创建数据库。根据你的需求,设计和创建适合项目的数据库结构,并使用数据库管理系统(如MySQL或Oracle)进行管理。 5. 开发前端界面。使用HTML、CSS和JavaScript等前端技术创建网站的用户界面。你可以使用现有的前端框架(如Bootstrap)来简化开发过程。 6. 开发后端逻辑。使用Java编写后端代码,处理用户请求、数据验证、业务逻辑处理和数据库交互等功能。根据需要,你可以使用框架提供的功能(如路由、数据绑定、ORM等)来简化开发过程。 7. 集成搜索功能。实现搜索功能是创建类似于百度网站的重要部分。你可以使用搜索引擎技术(如Elasticsearch)或数据库全文搜索功能来实现搜索功能。 8. 运行和测试项目。在本地开发环境运行项目,并使用浏览器测试网站的各个功能和页面。 9. 部署项目。将项目部署到生产环境的服务器上,确保服务器配置正确,并配置域名和网络访问。 10. 定期维护和更新项目。监控和维护项目的正常运行,及时修复bug,并根据用户反馈或需求进行功能更新和优化。 请注意,这只是一个基本的步骤指南,实际开发过程会有更多的细节和技术选择。根据你的具体需求和技术经验,你可能需要进一步学习和探索相关的技术和工具。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值