关于java:从具有http DELETE类型的方法重定向到具有GET类型的方法

redirect from method with http DELETE type to method with GET type

我使用类型为"DELETE"的jquery ajax发送请求。 在服务器端,我有approprite句柄方法,如下所示:

1
2
3
4
5
   @RequestMapping(value ="/{id}", method = RequestMethod.DELETE)
    public String delete(@RequestParam("hotel") String hotelCode, @PathVariable Long id, Model model){
        //delete operation
        return"redirect:/HotelTaxesAndCharges?hotel="+hotelCode;
    }

我想在删除后重定向我的调用的方法如下所示

1
2
3
4
5
@RequestMapping(method = RequestMethod.GET)
public String getAll(@RequestParam("hotel") String hotelCode, Model model){
    //logic
    return 'getAll';
}

因此,当我在执行期间调用delete方法时,我收到错误"您可以仅使用GET PUT或HEAD方法重定向到JSP"。 我找到了使用HiddenHttpMethodFilter的解决方案,但结果代码看起来有点乱,我需要使用POST发送请求并添加其他参数(_method)以使用自定义请求类型进行请求。

所以我的问题是DELETE / REDIRECT / GET转换的任何其他解决方案。

抱歉不好的英语

UPDATE
enter image description here

所以你可以使用删除重定向。 如果我将所有内容从删除更改为帖子,我会得到:

enter image description here


即使不是您需要的,也会发生什么是正常现象:

  • 您从ajax提交DELETE请求
  • Spring控制器接收它并回答"重定向:/.../ Hotel ..."
  • Spring ViewResolver使用代码302和正确的Location标头发送重定向响应
  • 浏览器使用先前方法和新位置(正常为302)发出DELETE(当你预期获得时)
  • @RequestMapping用于method = GET时,Spring DispatcherServlet接收DELETE /.../Hotel...
  • Spring DispatcherServlet正确地指出没有定义控制器并发出错误

所有这些都由您的wireshark痕迹确认

它在发送POST请求时有效,因为为了与HTTP 1.0兼容,所有主流浏览器都使用GET进行POST后的重定向,如果状态为303

有一个立即解决方法:除了GET之外,允许重定向URL的方法接受DELETE。不是很贵,但不是很好。

您还可以在客户端管理重定向:只需发送一个由ajax接收的200代码,然后让ajax进行重定向

最后一个解决方案在于使用一个303代码,该代码明确地要求浏览器独立于先前的方法发出GET。您可以通过让控制器请求将HttpServletResponse作为paremeter并返回null来对其进行硬编码。然后,您手动添加Location标头和303状态代码。

但您也可以通过将其redirectHttp10Compatible属性设置为false来将InternalResourceViewResolver配置为返回303代码而不是302代码。您可以在servlet应用程序上下文中声明一个bean,Spring将使用它。但是,您不能与不支持HTTP 1.1和303状态代码的旧浏览器兼容。