最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解決httpServletRequest.getParameter獲取不到參數(shù)的問題

 更新時間:2023年07月29日 08:56:26   作者:和代碼去流浪  
這篇文章主要介紹了解決httpServletRequest.getParameter獲取不到參數(shù)的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

httpServletRequest.getParameter獲取不到參數(shù)

用httpServletRequest.getParameter接收post請求參數(shù),發(fā)送端content Type必須設(shè)置為application/x-www-form-urlencoded;否則會接收不到

 @RequestMapping(value = "/a2")
    @ResponseBody
    public String hello3(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) {
        String string = httpServletRequest.getParameter("json");
        System.out.println(string);
        return "hahah";
    }

 用@RequestBody接收請求可以用任意類型的content Type

@RequestMapping(value = "/a")
    @ResponseBody
    public void hello1(@RequestBody String string) {
        System.out.println(string);
    }

application/x-www-form-urlencoded通過表單提交,在sevlet實現(xiàn)中,mutipart/form-data和application/x-www-form-urlencoded會被特殊處理,請求參數(shù)將被放置于request.paramter,這是一個map。

我們可以從map中獲取參數(shù)進(jìn)行驗證,或者其他攔截需求,map的獲取類似hibernate的延遲加載,當(dāng)調(diào)用request.getparamter()方法,servlet才會從請求流中讀取請求參數(shù)加載入map。

InputStream也會存有這份數(shù)據(jù),但如果這份數(shù)據(jù)被讀取,那么到了controller層將無法讀出數(shù)據(jù),同樣,攔截之后到達(dá)controller層時請求數(shù)據(jù)已經(jīng)被加載入了controller層方法實參,實參對象需要有set方法,框架會以反射的方式調(diào)用屬性的set方法注入數(shù)據(jù),數(shù)據(jù)只會被注入到已有的屬性。

當(dāng)以application/json的content-type傳送數(shù)據(jù),被傳送的對象只需被json序列化。

當(dāng)以application/x-www-form-urlencoded的方式傳送數(shù)據(jù)。

請求的內(nèi)容需要以..=..&..=..的格式提交,在請求體內(nèi)內(nèi)容將會以”&”和“ = ”進(jìn)行拆分。

HttpServletRequest.getParameter 亂碼情況,源碼解析

出現(xiàn)這種情況,一般的解決辦法,如:HttpServletRequest.setCharacterEncoding("utf-8")是無效的。

因為HttpServletRequest在實例化的時候是根據(jù)請求的Content-Type讀取編碼如果Content-Type的值找不到那么就會用默認(rèn)是編碼格式ISO-8859-1

源碼如下 

org.apache.catalina.connector.Request

 
package org.apache.catalina.connector;
public class Request
     @Override
    public String getParameter(String name) {
        if (!parametersParsed) {
            parseParameters();
        }
        return coyoteRequest.getParameters().getParameter(name);
    }
	/**
     * Parse request parameters.
     */
    protected void parseParameters() {
        parametersParsed = true;
        Parameters parameters = coyoteRequest.getParameters();
        boolean success = false;
        try {
            // Set this every time in case limit has been changed via JMX
            parameters.setLimit(getConnector().getMaxParameterCount());
            // getCharacterEncoding() may have been overridden to search for
            // hidden form field containing request encoding
            String enc = getCharacterEncoding();
            boolean useBodyEncodingForURI = connector.getUseBodyEncodingForURI();
            if (enc != null) {
                parameters.setEncoding(enc);
                if (useBodyEncodingForURI) {
                    parameters.setQueryStringEncoding(enc);
                }
            } else {
                parameters.setEncoding
                    (org.apache.coyote.Constants.DEFAULT_CHARACTER_ENCODING);
                if (useBodyEncodingForURI) {
                    parameters.setQueryStringEncoding
                        (org.apache.coyote.Constants.DEFAULT_CHARACTER_ENCODING);
                }
            }
		.....
		省略
		.....
    }
	/**
     * Get the character encoding used for this request.
     */
    public String getCharacterEncoding() {
        if (charEncoding != null)
            return charEncoding;
        charEncoding = ContentType.getCharsetFromContentType(getContentType());
        return charEncoding;
    }
}

org.apache.tomcat.util.http.ContentType

package org.apache.tomcat.util.http;
public class ContentType {
    /**
     * Parse the character encoding from the specified content type header.
     * If the content type is null, or there is no explicit character encoding,
     * <code>null</code> is returned.
     *
     * @param contentType a content type header
     */
    public static String getCharsetFromContentType(String contentType) {
        if (contentType == null) {
            return (null);
        }
        int start = contentType.indexOf("charset=");
        if (start < 0) {
            return (null);
        }
        String encoding = contentType.substring(start + 8);
        int end = encoding.indexOf(';');
        if (end >= 0) {
            encoding = encoding.substring(0, end);
        }
        encoding = encoding.trim();
        if ((encoding.length() > 2) && (encoding.startsWith("\""))
            && (encoding.endsWith("\""))) {
            encoding = encoding.substring(1, encoding.length() - 1);
        }
        return (encoding.trim());
    }
}

org.apache.coyote.Constants

package org.apache.coyote;
public final class Constants {
    // -------------------------------------------------------------- Constants
    public static final String Package = "org.apache.coyote";
    public static final String DEFAULT_CHARACTER_ENCODING="ISO-8859-1";
	...
	省略
	...
}

org.apache.catalina.connector.Request.java為實際實現(xiàn)類,剩下你見到的亂七八糟的都是他的裝飾類。

可以見到,getParameter的時候會先判斷是否曾經(jīng)解析過編碼。

如果從來未使用getParameter的話,會先對數(shù)據(jù)進(jìn)行編碼格式設(shè)置。

這也就為什么,setCharacterEncoding一定要在getParameter之前。

方法parseParameters里有這么一行代碼String enc = getCharacterEncoding();這行代碼決定了post的編碼格式,我們再往里面跑可以看到。

org.apache.tomcat.util.http.ContentType.java類的getCharsetFromContentType方法中,編碼格式是由http.headersContent-Type中搜索charset=截取出來的。

如果里面不包含編碼格式,那么就會使用默認(rèn)字符集ISO-8859-1到這里為止,整個過程已經(jīng)很清晰了。

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 使用spring security明文密碼校驗時報錯-BadCredentialsException: Bad credentials的問題

    使用spring security明文密碼校驗時報錯-BadCredentialsException:&nbs

    小編遇到這樣一個問題在學(xué)習(xí)spring security時使用明文密碼進(jìn)行登錄校驗時報錯"org.springframework.security.authentication.BadCredentialsException: Bad credentials,今天給大家分享問題原因及解決方案,感興趣的朋友一起看看吧
    2023-10-10
  • 詳解Spring Cloud Hystrix斷路器實現(xiàn)容錯和降級

    詳解Spring Cloud Hystrix斷路器實現(xiàn)容錯和降級

    本篇文章主要介紹了詳解Spring Cloud Hystrix斷路器實現(xiàn)容錯和降級,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • java數(shù)學(xué)工具類Math詳解(round方法)

    java數(shù)學(xué)工具類Math詳解(round方法)

    這篇文章主要為大家詳細(xì)介紹了java數(shù)學(xué)工具類Math,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • Spring多線程的使用以及問題詳解

    Spring多線程的使用以及問題詳解

    在我們開發(fā)系統(tǒng)過程中,經(jīng)常會處理一些費時間的任務(wù)(如:向數(shù)據(jù)庫中插入大量數(shù)據(jù)),這個時候就就需要使用多線程,下面這篇文章主要給大家介紹了關(guān)于Spring多線程的使用以及問題的相關(guān)資料,需要的朋友可以參考下
    2022-05-05
  • java實現(xiàn)簡易的學(xué)籍管理系統(tǒng)

    java實現(xiàn)簡易的學(xué)籍管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)簡易的學(xué)籍管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • java線程池參數(shù)位置導(dǎo)致的奪命故障宿主機打不開

    java線程池參數(shù)位置導(dǎo)致的奪命故障宿主機打不開

    這篇文章主要為大家介紹了java線程池參數(shù)位置導(dǎo)致的奪命故障宿主機打不開的問題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Spring創(chuàng)建bean的幾種方式及使用場景

    Spring創(chuàng)建bean的幾種方式及使用場景

    本文主要介紹了Spring創(chuàng)建bean的幾種方式及使用場景,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Java FileDescriptor總結(jié)_動力節(jié)點Java學(xué)院整理

    Java FileDescriptor總結(jié)_動力節(jié)點Java學(xué)院整理

    FileDescriptor 是“文件描述符”??梢员挥脕肀硎鹃_放文件、開放套接字等。接下來通過本文給大家分享Java FileDescriptor總結(jié),感興趣的朋友一起學(xué)習(xí)吧
    2017-05-05
  • Java實用工具之StringJoiner詳解

    Java實用工具之StringJoiner詳解

    這篇文章主要介紹了Java實用工具之StringJoiner詳解,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-05-05
  • 非常適合新手學(xué)生的Java線程池優(yōu)化升級版

    非常適合新手學(xué)生的Java線程池優(yōu)化升級版

    作者是一個來自河源的大三在校生,以下筆記都是作者自學(xué)之路的一些淺薄經(jīng)驗,如有錯誤請指正,將來會不斷的完善筆記,幫助更多的Java愛好者入門
    2022-03-03

最新評論

武穴市| 铜山县| 利辛县| 广德县| 仁布县| 固安县| 曲松县| 怀远县| 溧阳市| 茌平县| 大姚县| 新郑市| 洛川县| 琼结县| 长沙市| 绍兴县| 页游| 辉县市| 天等县| 南安市| 临汾市| 会泽县| 宿州市| 霞浦县| 青冈县| 宜昌市| 弥勒县| 方山县| 岑巩县| 临夏市| 无为县| 阳信县| 盘锦市| 郁南县| 新营市| 岫岩| 涡阳县| 宿松县| 崇义县| 长乐市| 大悟县|