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
所以你可以使用删除重定向。 如果我将所有内容从删除更改为帖子,我会得到:
-
你在哪里得到错误?错误消息究竟是什么样的?
-
@axtavt,我在重定向期间收到错误,错误消息现在看起来像"请求方法'DELETE'不支持"。我不知道如何将请求类型从删除转换为重定向。
-
如果我你POST类型而不是DELETE一切正常
-
你能窥探你的浏览器和你的服务器之间的对话(wireshark很擅长)?我尝试使用精简控制器@RequestMapping(value="/delete", method=RequestMethod.DELETE) public String delete(HttpServletRequest req) { return"redirect:/welcome"; }的以下方法进行重定向,使用DELETE方法调用它并获得正确的重定向响应。我认为问题不在于spring-mvc(使用spring 3.2.4和tomcat 7)
-
@SergeBallesta,我添加了两个截图。首先,您可以在重定向过程中看到错误,因为结果方法请求类型= GET。在第二个屏幕截图中,您可以看到如果我将删除更改为Post一切顺利,结果方法是GET
-
如果您使用DELETE请求重定向没有任何意义。请阅读我的答案以获取更多信息stackoverflow.com/questions/15996779/。它并不完全相同,但同样的原则适用。
即使不是您需要的,也会发生什么是正常现象:
-
您从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状态代码的旧浏览器兼容。