【问题标题】:SpringMVC Redirect after PUT is failing with 405 errorPUT 失败并出现 405 错误后 SpringMVC 重定向
【发布时间】:2015-06-02 02:38:22
【问题描述】:

我正在使用 SpringBoot 1.2.3.RELEASE,它是一个使用 thymeleaf 和 jquery 的简单 SpringMVC Web 应用程序。

我的控制器:

@Controller
@RequestMapping(value="/cart")
public class CartController
{
    @RequestMapping(value="", method=RequestMethod.GET)
    public String showCart(HttpServletRequest request, Model model)
    {
        Cart cart = getOrCreateCart(request);
        model.addAttribute("cart", cart);
        return "cart";
    }

    @RequestMapping(value="/items", method=RequestMethod.PUT)
    public String updateCartItem(@RequestBody LineItem item, HttpServletRequest request, HttpServletResponse response)
    {
        Cart cart = getOrCreateCart(request);
        cart.updateItemQuantity(item.getProduct(), item.getQuantity());
        return "redirect:/cart";
    }
}

我正在使用 jquery 发送 PUT 请求,如下所示:

$.ajax ({ 
    url: 'cart/items', 
    type: "PUT", 
    dataType: "json",
    contentType: "application/json",
    data : '{ "product" :{ "sku":"'+ sku +'"},"quantity":"'+quantity+'"}',  
    success: function(responseData, status, xhttp){ 
        alert(responseData); 
        //location.reload(); 
    }
});

当触发此 PUT 请求时,它会到达 updateCartItem() 方法,然后使用 return "redirect:/cart"; 它会抛出 PUT http://localhost:8080/cart 405(不允许的方法)错误。

为什么重定向视图带有相同的重定向 url 的 PUT 方法?

我在405 JSP error with Put Method看到过类似的情况

如何以春季方式解决此问题?

【问题讨论】:

    标签: jquery spring spring-mvc spring-boot


    【解决方案1】:

    尝试:

    $.ajax({
        url: 'cart/items',
        type: 'POST',
        data: {
            _method: 'PUT'
        },
        success: function(data) {
            ...
        }
    });
    

    在springmvc web.xml中添加几行

    <filter>
        <filter-name>HiddenHttpMethodFilter</filter-name>
        <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
    </filter>
    <filter-mapping>  
        <filter-name>HiddenHttpMethodFilter</filter-name>  
        <servlet-name>springmvc</servlet-name>  
    </filter-mapping> 
    

    【讨论】:

    • springboot 已经注册了 HiddenHttpMethodFilter。这只会启用发送 PUT,但这已经在工作了。问题是重定向应该发出 GET 请求而不是 PUT。
    • 你试过@RequestMapping(value="", method=RequestMethod.GET)删除method=RequestMethod.GET吗?
    • 该方法应该只提供 GET 服务,因为其他方法对 url /cart 有不同的操作
    • 使用 ajax 你可以做到 `success: function(data) { location.href = '/cart' }`
    • 这是一个可行的解决方法。我将探讨它在普通表单提交和使用 jquery $.ajax() 时的行为。我在想如果它是 ajax 请求,那么它会保留 RequestMethod 以供后续请求。
    猜你喜欢
    • 2015-07-17
    • 2021-10-16
    • 2023-03-21
    • 2018-07-15
    • 1970-01-01
    • 2021-07-03
    • 1970-01-01
    • 2019-04-02
    • 1970-01-01
    相关资源
    最近更新 更多