tomcat引數編碼處理過程

2021-09-02 03:16:13 字數 2685 閱讀 8683

處理請求的資料

// 例如:127.0.0.1:8080/test.jsp?a=%e4%b8%ad%e5%9b%bd

request.unparseduri().setbytes(buf, start, end - start);

if (questionpos >= 0) else

3. org.apache.catalina.connector.coyoteadapter

public void service(org.apache.coyote.request req,

org.apache.coyote.response res)

/*** service method. */

public void service(org.apache.coyote.request req,

org.apache.coyote.response res)

throws exception

if (connector.getxpoweredby())

/*** parse additional request parameters. */

protected boolean postparserequest(org.apache.coyote.request req,

request request,

org.apache.coyote.response res,

response response)

3. 解析引數

org.apache.catalina.connector.request.parseparameters

/*** parse request parameters. */

protected void parseparameters()

} else }

// 解析query str

parameters.handlequeryparameters();

if (usinginputstream || usingreader)

return;

// 不是post, 直接返回

if (!getmethod().equalsignorecase("post"))

return;

string contenttype = getcontenttype();

if (contenttype == null)

contenttype = "";

int semicolon = contenttype.indexof(';');

if (semicolon >= 0) else

// 當不是表單資料時, 返回

return;

// 是表單資料, 讀取解析

int len = getcontentlength();

if (len > 0)

return; }

byte formdata = null;

if (len < cached_post_len) else

try

} catch (ioexception e)

return; }

parameters.processparameters(formdata, 0, len);

} else if ("chunked".equalsignorecase(

coyoterequest.getheader("transfer-encoding"))) catch (ioexception e)

return; }

if (formdata != null) }

}// 使用querystr的encoding

public void processparameters( messagebytes data, string encoding ) else }

小結:1. 所有引數tomcat都會先做url decode(這很正常, 標準情況下, 都要做url編碼, 可同時保證特殊字元的正確傳送, 不管get傳參還是post傳參)

字元 特殊字元的含義 url編碼 

# 用來標誌特定的文件位置 %23 

% 對特殊字元進行編碼 %25 

& 分隔不同的變數值對 %26 

+ 在變數值中表示空格 %2b 

\ 表示目錄路徑 %2f 

= 用來連線鍵和值 %3d 

? 表示查詢字串的開始 %3f

2. 做url編碼時, 肯定有指定的字符集(這裡假定為utf-8), 如果後端的處理字符集與此字符集不同, 一般來說, 就有亂碼

針對get方式的引數,  有兩種方式, 可以正確處理

(1) tomcat的伺服器配置uriencoding="utf-8"

(2) tomcat的伺服器配置usebodyencodingforuri="true", 讀取引數之前, 設定

request.setcharacterencoding("utf-8");

針對post方式的引數, 只要設定如下即可:

request.setcharacterencoding("utf-8");

USB host處理過程

在usbh core.c中有乙個函式usbh process 這個函式很重要,main 函式每迴圈一次,它就執行一次,它處理所有usb核心狀態的變化,typedef enum host state 根據這個當前狀態 phost gstate 處於以上哪個狀態的不同,做出不同的處理過程。其中最重要的要...

Hadoop map reduce處理過程

1 在hadoop中,每個mapreduce任務都被初始化為乙個job。每個job又可以分成兩個階段 map階段和reduce階段 map函式接受乙個形式的輸入,然後同樣產生乙個形式的中間輸出,hadoop會負責將所有具有相同結果中間key值的value集合到一起傳給reduce函式,reduce函...

Openstack nova api 處理過程

乙個python函式示例 乙個python類的示例 所有的web請求引數都被封裝在environ這個dictionary中,start response函式讓人難以理解,其主要作用是設定reponse的http返回碼和http header.返回的list的乙個item對應於http respons...