将具有HTTP DELETE类型的方法重定向到具有GET类型的方法。

10 浏览
0 Comments

将具有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,我会得到这个结果:

0
0 Comments

问题的原因是,当使用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状态码的旧版浏览器兼容性丢失。

以上是解决问题的几种方法,根据实际情况选择适合的方法即可。

0