springboot中put請(qǐng)求(content-type為application/x-www-form-urlencoded)中url有占位符參數(shù)并且請(qǐng)求體中有參數(shù)尼摹,請(qǐng)求體中參數(shù)獲取不到

springboot中自帶HttpPutFormContentFilter用于處理put請(qǐng)求见芹,如果獲取不到參數(shù)剂娄,可以將該過濾器優(yōu)先級(jí)提高,如下:

package com.mycompany.myapp.config;

import javax.servlet.annotation.WebFilter;

import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.HttpPutFormContentFilter;

/**
* @author xuzhipeng
* @date 2018-11-20 15:47:39
* @since 1.0
*/
@Component
@WebFilter(urlPatterns = "/*", filterName = "putFilter")
@Order(Integer.MIN_VALUE)
public class PutFilter extends HttpPutFormContentFilter {

}

/*
 * Copyright 2002-2018 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.springframework.web.filter;

import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Enumeration;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;

import org.springframework.http.HttpInputMessage;
import org.springframework.http.MediaType;
import org.springframework.http.converter.FormHttpMessageConverter;
import org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter;
import org.springframework.http.server.ServletServerHttpRequest;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.MultiValueMap;
import org.springframework.util.StringUtils;

/**
 * {@link javax.servlet.Filter} that makes form encoded data available through
 * the {@code ServletRequest.getParameter*()} family of methods during HTTP PUT
 * or PATCH requests.
 *
 * <p>The Servlet spec requires form data to be available for HTTP POST but
 * not for HTTP PUT or PATCH requests. This filter intercepts HTTP PUT and PATCH
 * requests where content type is {@code 'application/x-www-form-urlencoded'},
 * reads form encoded content from the body of the request, and wraps the ServletRequest
 * in order to make the form data available as request parameters just like
 * it is for HTTP POST requests.
 *
 * @author Rossen Stoyanchev
 * @since 3.1
 */
public class HttpPutFormContentFilter extends OncePerRequestFilter {

    private FormHttpMessageConverter formConverter = new AllEncompassingFormHttpMessageConverter();


    /**
     * Set the converter to use for parsing form content.
     * <p>By default this is an instnace of {@link AllEncompassingFormHttpMessageConverter}.
     */
    public void setFormConverter(FormHttpMessageConverter converter) {
        Assert.notNull(converter, "FormHttpMessageConverter is required.");
        this.formConverter = converter;
    }

    public FormHttpMessageConverter getFormConverter() {
        return this.formConverter;
    }

    /**
     * The default character set to use for reading form data.
     * This is a shortcut for:<br>
     * {@code getFormConverter.setCharset(charset)}.
     */
    public void setCharset(Charset charset) {
        this.formConverter.setCharset(charset);
    }


    @Override
    protected void doFilterInternal(final HttpServletRequest request, HttpServletResponse response,
            FilterChain filterChain) throws ServletException, IOException {

        if (("PUT".equals(request.getMethod()) || "PATCH".equals(request.getMethod())) && isFormContentType(request)) {
            HttpInputMessage inputMessage = new ServletServerHttpRequest(request) {
                @Override
                public InputStream getBody() throws IOException {
                    return request.getInputStream();
                }
            };
            MultiValueMap<String, String> formParameters = this.formConverter.read(null, inputMessage);
            if (!formParameters.isEmpty()) {
                HttpServletRequest wrapper = new HttpPutFormContentRequestWrapper(request, formParameters);
                filterChain.doFilter(wrapper, response);
                return;
            }
        }

        filterChain.doFilter(request, response);
    }

    private boolean isFormContentType(HttpServletRequest request) {
        String contentType = request.getContentType();
        if (contentType != null) {
            try {
                MediaType mediaType = MediaType.parseMediaType(contentType);
                return (MediaType.APPLICATION_FORM_URLENCODED.includes(mediaType));
            }
            catch (IllegalArgumentException ex) {
                return false;
            }
        }
        else {
            return false;
        }
    }


    private static class HttpPutFormContentRequestWrapper extends HttpServletRequestWrapper {

        private MultiValueMap<String, String> formParameters;

        public HttpPutFormContentRequestWrapper(HttpServletRequest request, MultiValueMap<String, String> parameters) {
            super(request);
            this.formParameters = parameters;
        }

        @Override
        @Nullable
        public String getParameter(String name) {
            String queryStringValue = super.getParameter(name);
            String formValue = this.formParameters.getFirst(name);
            return (queryStringValue != null ? queryStringValue : formValue);
        }

        @Override
        public Map<String, String[]> getParameterMap() {
            Map<String, String[]> result = new LinkedHashMap<>();
            Enumeration<String> names = getParameterNames();
            while (names.hasMoreElements()) {
                String name = names.nextElement();
                result.put(name, getParameterValues(name));
            }
            return result;
        }

        @Override
        public Enumeration<String> getParameterNames() {
            Set<String> names = new LinkedHashSet<>();
            names.addAll(Collections.list(super.getParameterNames()));
            names.addAll(this.formParameters.keySet());
            return Collections.enumeration(names);
        }

        @Override
        @Nullable
        public String[] getParameterValues(String name) {
            String[] parameterValues = super.getParameterValues(name);
            List<String> formParam = this.formParameters.get(name);
            if (formParam == null) {
                return parameterValues;
            }
            if (parameterValues == null || getQueryString() == null) {
                return StringUtils.toStringArray(formParam);
            }
            else {
                List<String> result = new ArrayList<>(parameterValues.length + formParam.size());
                result.addAll(Arrays.asList(parameterValues));
                result.addAll(formParam);
                return StringUtils.toStringArray(result);
            }
        }
    }

}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末玄呛,一起剝皮案震驚了整個(gè)濱河市阅懦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌徘铝,老刑警劉巖耳胎,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異惕它,居然都是意外死亡怕午,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門淹魄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來郁惜,“玉大人,你說我怎么就攤上這事甲锡≌捉叮” “怎么了?”我有些...
    開封第一講書人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵缤沦,是天一觀的道長虎韵。 經(jīng)常有香客問我,道長缸废,這世上最難降的妖魔是什么包蓝? 我笑而不...
    開封第一講書人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮企量,結(jié)果婚禮上养晋,老公的妹妹穿的比我還像新娘。我一直安慰自己梁钾,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開白布逊抡。 她就那樣靜靜地躺著姆泻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪冒嫡。 梳的紋絲不亂的頭發(fā)上拇勃,一...
    開封第一講書人閱讀 52,328評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音孝凌,去河邊找鬼方咆。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蟀架,可吹牛的內(nèi)容都是我干的瓣赂。 我是一名探鬼主播榆骚,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼煌集!你這毒婦竟也來了妓肢?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤苫纤,失蹤者是張志新(化名)和其女友劉穎碉钠,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體卷拘,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡喊废,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了栗弟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片污筷。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡兽掰,死狀恐怖第晰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情识颊,我是刑警寧澤耿焊,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布揪惦,位于F島的核電站,受9級(jí)特大地震影響罗侯,放射性物質(zhì)發(fā)生泄漏器腋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一钩杰、第九天 我趴在偏房一處隱蔽的房頂上張望纫塌。 院中可真熱鬧,春花似錦讲弄、人聲如沸措左。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽怎披。三九已至,卻和暖如春瓶摆,著一層夾襖步出監(jiān)牢的瞬間凉逛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來泰國打工群井, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留状飞,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像诬辈,于是被迫代替她去往敵國和親酵使。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理自晰,服務(wù)發(fā)現(xiàn)凝化,斷路器,智...
    卡卡羅2017閱讀 134,702評(píng)論 18 139
  • Spring Web MVC Spring Web MVC 是包含在 Spring 框架中的 Web 框架酬荞,建立于...
    Hsinwong閱讀 22,435評(píng)論 1 92
  • 今晚拜讀了有關(guān)雷軍上班與創(chuàng)業(yè)的文章搓劫。在小米出現(xiàn)前,我關(guān)注過智能手機(jī)的資訊混巧,也閱讀了很多有關(guān)雷軍的文章枪向,今晚看的這篇...
    李甫貴水膚蘭全國市場總監(jiān)閱讀 279評(píng)論 2 2
  • 文/SS_大小姐 參賽編號(hào):467 這兩天奶茶的電影上映秘蛔,名字叫后來。聽名字就種傷感回憶的味道傍衡。 于是我也在自己稀...
    SS_大小姐閱讀 433評(píng)論 8 17
  • 所謂生活深员,不過是凄涼。 所謂成長蛙埂,不過是彷徨倦畅。 所謂歲月,不過是遺忘绣的。 所謂青春叠赐,不過是流浪。 不如意太多屡江,如意太...
    2485f51b393f閱讀 165評(píng)論 0 0