将具有HTTP DELETE类型的方法重定向到具有GET类型的方法。
将具有HTTP DELETE类型的方法重定向到具有GET类型的方法。
我使用jquery ajax发送了一个类型为"DELETE"的请求。在服务器端,我有一个适当的处理方法,如下所示:
@RequestMapping(value = "/{id}", method = RequestMethod.DELETE) public String delete(@RequestParam("hotel") String hotelCode, @PathVariable Long id, Model model){ //删除操作 return "redirect:/HotelTaxesAndCharges?hotel="+hotelCode; }
我想在删除后将我的调用重定向到另一个方法,该方法如下所示:
@RequestMapping(method = RequestMethod.GET) public String getAll(@RequestParam("hotel") String hotelCode, Model model){ //逻辑 return 'getAll'; }
所以当我在执行过程中调用删除方法时,我会收到错误消息"你只能使用GET、PUT或HEAD方法重定向到JSP"。我发现了使用HiddenHttpMethodFilter的解决方案,但结果代码看起来有点混乱,而且我需要使用POST发送请求,并添加额外的参数(_method)到具有自定义请求类型的请求中。
所以我的问题是,是否有其他解决DELETE/REDIRECT/GET转换的方法。
更新:
你可以看到它也使用delete进行重定向。如果我把所有的delete都改成post,我会得到这个结果:
问题的原因是,当使用HTTP DELETE类型的方法重定向到GET类型的方法时,浏览器会使用之前的方法和新的位置,导致问题出现。
解决方法有以下几种:
1. 在重定向的URL上允许接受DELETE方法,以及GET方法。这种方法成本不高,但不够优雅。
2. 在客户端管理重定向:只需发送一个200代码给ajax,让ajax进行重定向。
3. 使用303代码来显式地要求浏览器发出GET请求,无论之前的方法是什么。可以通过在控制器请求中添加HttpServletResponse参数并返回null来硬编码实现。然后手动添加Location头和303状态码。
4. 通过设置InternalResourceViewResolver的redirectHttp10Compatible属性为false,将其配置为返回303代码而不是302。只需在servlet应用程序上下文中声明一个bean,Spring将使用它。但这会导致与不支持HTTP 1.1和303状态码的旧版浏览器兼容性丢失。
以上是解决问题的几种方法,根据实际情况选择适合的方法即可。