SpringBoot2之PUT请求接收不了参数的解决方案

 更新时间:2022年07月01日 10:10:50   作者:Moshow郑锴  
这篇文章主要介绍了SpringBoot2之PUT请求接收不了参数的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

SpringBoot2之PUT请求接收不了参数的解决办法,这个问题,关乎两个Filter过滤器,是spring3和3.5之后提供的,目的就是解决RESTful中PUT请求或者其他请求的问题。

下面请看详细内容

HiddenHttpMethodFilter

html中form表单只支持GET与POST请求,而DELETE、PUT等method并不支持,spring3添加了一个过滤器,可以将这些请求转换为标准的http方法,使得支持GET、POST、PUT与DELETE请求。

    @Bean
    public FilterRegistrationBean<HiddenHttpMethodFilter> testFilterRegistration3() {
        FilterRegistrationBean<HiddenHttpMethodFilter> registration = new FilterRegistrationBean<HiddenHttpMethodFilter>();
        registration.setFilter(new HiddenHttpMethodFilter());//添加过滤器
        registration.addUrlPatterns("/*");//设置过滤路径,/*所有路径
        registration.setName("HiddenHttpMethodFilter");//设置优先级
        registration.setOrder(2);//设置优先级
        return registration;
    }

在页面的form表单中设置method为Post,并添加一个如下的隐藏域:

<input type="hidden" name="_method" value="put" />

查看HiddenHttpMethodFilter源码

        String paramValue = request.getParameter(methodParam);  
        if("POST".equals(request.getMethod()) && StringUtils.hasLength(paramValue)) {  
            String method = paramValue.toUpperCase(Locale.ENGLISH);  
            HttpServletRequest wrapper = new HttpMethodRequestWrapper(request, method); 
            filterChain.doFilter(wrapper, response);  
        } else  
        {  
            filterChain.doFilter(request, response);  
        }  
}  

 由源码可以看出,filter只对Post方法进行过滤,且需要添加参数名为_method的隐藏域,也可以设置其他参数名,比如想设置为_method_,可以在HiddenHttpMethodFilter配置类中设置初始化参数:put (methodParam,"_method_") 

HttpPutFormContentFilter

由HiddenHttpMethodFilter可知,html中的form的method值只能为post或get,我们可以通过HiddenHttpMethodFilter获取put表单中的参数键值对,而在Spring3中获取put表单的参数键值对还有另一种方法,即使用HttpPutFormContentFilter过滤器。

    @Bean
    public FilterRegistrationBean<HttpPutFormContentFilter> testFilterRegistration2() {
        FilterRegistrationBean<HttpPutFormContentFilter> registration = new FilterRegistrationBean<HttpPutFormContentFilter>();
        registration.setFilter(new HttpPutFormContentFilter());//添加过滤器
        registration.addUrlPatterns("/*");//设置过滤路径,/*所有路径
        registration.setName("HttpPutFormContentFilter");//设置优先级
        registration.setOrder(2);//设置优先级
        return registration;
    }

HttpPutFormContentFilter过滤器的作为就是获取put表单的值,并将之传递到Controller中标注了method为RequestMethod.put的方法中。

与HiddenHttpMethodFilter不同,在form中不用添加参数名为_method的隐藏域,且method不必是post,直接写成put,但该过滤器只能接受enctype值为application/x-www-form-urlencoded的表单,也就是说,在使用该过滤器时,form表单的代码必须如下:

<form action="" method="put" enctype="application/x-www-form-urlencoded">  
    ......  
</form>  

另外,经过测试,json数据也是ok的,enctype=”application/json”也是ok的

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Spring Boot利用Docker快速部署项目的完整步骤

    Spring Boot利用Docker快速部署项目的完整步骤

    这篇文章主要给大家介绍了关于Spring Boot利用Docker快速部署项目的完整步骤,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring Boot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-07-07
  • 详解Spring Boot Web项目之参数绑定

    详解Spring Boot Web项目之参数绑定

    本篇文章主要介绍了详解Spring Boot Web项目之参数绑定,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • Springboot FatJa原理机制源码解析

    Springboot FatJa原理机制源码解析

    这篇文章主要为大家介绍了Springboot FatJa原理机制源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • SpringMvc获取页面中的参数方法详解

    SpringMvc获取页面中的参数方法详解

    这篇文章主要介绍了SpringMvc获取页面中的参数方法详解,获取页面的参数通常都是让类实现设置HttpServletRequest request接口然后重写接口中的方法的办法来得到参数,但是在Springmvc中有其他的获取方法,需要的朋友可以参考下
    2023-10-10
  • Spring 代理 Bean 获取不到原始 Bean 对象注解解决方法

    Spring 代理 Bean 获取不到原始 Bean 对象注解解决方法

    这篇文章主要介绍了Spring 代理 Bean 获取不到原始 Bean 对象注解解决方法,文章围绕主题相关资料展开详细介绍,需要的小伙伴可以参考一下
    2022-04-04
  • Spring3 中 RabbitMQ 的使用与常见场景分析

    Spring3 中 RabbitMQ 的使用与常见场景分析

    本文介绍了Spring3中RabbitMQ的使用,涵盖了RabbitMQ的基本知识、五种模式、数据隔离、消费者确认、死信交换机、延迟功能、消息堆积解决方法、高可用性以及消息重复消费问题的解决方案,感兴趣的朋友跟随小编一起看看吧
    2025-02-02
  • Mybatis中resultMap的Colum和property属性详解

    Mybatis中resultMap的Colum和property属性详解

    这篇文章主要介绍了Mybatis中resultMap的Colum和property属性,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教。
    2022-01-01
  • Java单测void类型的方法详解

    Java单测void类型的方法详解

    这篇文章主要给大家介绍了Java中单测void类型的方法,文中给出了详细的示例代码,相信对大家的理解和学习具有一定的参考借鉴价值,需要的朋友可以跟着小编下面来一起学习学习吧。
    2017-01-01
  • Java并发控制机制详解

    Java并发控制机制详解

    这篇文章主要为大家详细介绍了Java并发控制机制,什么是Java并发控制机制,Java并发控制机制的作用,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • 聊一聊jdk1.8中的ArrayList 底层数组是如何扩容的

    聊一聊jdk1.8中的ArrayList 底层数组是如何扩容的

    这篇文章主要介绍了聊一聊jdk1.8中的ArrayList 底层数组是如何扩容的,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08

最新评论