今日项目bug及解决思路
今天我负责维护的预约系统项目出现了bug
bug 描述:用户点击取消预约 直接跳转到login页面
期望表现:弹出取消成功的提示框。
bug定位: 先考虑是否是代码问题,再考虑是否是技术栈老旧问题,最后考虑校园网的服务器权限问题。
思路:首先本地测试取消预约的 /request/{requestId}接口,发现本地运行可以得到正确结果。
然后查看服务器部署的tomcat和spring版本是否和过于老旧,从而可能有版本更新的问题,发现版本spring4.5 /稳定 tomcat8.5 /稳定
最后发现tomcat的原因
当前端向接口发送请求时,
- 1.controller会将请求体中的数据,封装成一个map
- 2.request.getParameter("requestId")就会从这个map中取值
- 3.SpringMvc封装POJO对象的时候,会把POJO中每个属性的值进行request.getParamter();
当AJAX发送delete请求时,请求体中的数据,request.getParamter()拿不到。
因为Tomcat一看是delete就不会封装请求体中的数据为map,只有POST形式的请求才封装请求为map
所以解决办法:
发送GET、POST请求只需要设置 type 参数值为对应的 'get'、'post'即可。
发送DELETE、PUT请求时
先需要在web.xml配置文件中添加一个将post请求转换为delete或put请求的filter,注意web.xml是项目WEB-INF文件夹里的,不是tomcat里conf里的web.xml。代码如下
<!-- 使用Rest风格的URI 将页面普通的post请求转为指定的delete或者put请求--> <filter> <filter-name>HiddenHttpMethodFilter</filter-name> <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> </filter> <filter-mapping> <filter-name>HiddenHttpMethodFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
前端$.ajax({})中设置type参数值为 post,然后在请求参数中加一个参数,参数键是 _method,参数值是 delete或put,代码如下
此时后端restful风格的接口即可正常使用啦。