這幾天碰到一個(gè)問(wèn)題。服務(wù)發(fā)布后神妹,無(wú)法接收post請(qǐng)求颓哮。準(zhǔn)確的說(shuō),所有post請(qǐng)求的參數(shù)都為空鸵荠。為什么會(huì)出現(xiàn)這種情況呢冕茅?
首先,得明確所有的post請(qǐng)求都是存放在http body里面的蛹找。之所以通常我們可以通過(guò)getParamenter(name)去獲取參數(shù)姨伤,是因?yàn)槿萜鳎╰omcat, jetty等)對(duì)http body的內(nèi)容進(jìn)行了處理,把參數(shù)讀取到了paramenterMap里面庸疾。
接下來(lái)去解決問(wèn)題姜挺。
網(wǎng)上說(shuō)有一種情況,說(shuō)我的請(qǐng)求是multiplepart的方式彼硫。顯然不是這個(gè)原因炊豪,我已經(jīng)加了這樣的攔截,如果是multiple-part拧篮,直接轉(zhuǎn)成MultipartRequest词渤。況且,通過(guò)請(qǐng)求頭的打印串绩,可以驗(yàn)證這一點(diǎn)缺虐。
public class MultiplePartInterceptor implements Interceptor {
public MultiplePartInterceptor() {
super();
}
@Override
public void intercept(Invocation inv) {
String content_type = inv.getController().getRequest().getContentType();
System.out.println(content_type);
if (content_type != null && content_type.toLowerCase().indexOf("multipart") != -1) {
if (inv.getController().getRequest() instanceof MultipartRequest == false)
inv.getController().setHttpServletRequest( new MultipartRequest(inv.getController().getRequest()));
}
inv.invoke();
}
}
還有一種說(shuō)法,就是我在getParamenter之前就調(diào)用了getInputStream或者getReader礁凡。因?yàn)檫@兩個(gè)方法只能讀取一次高氮,第二次讀取的時(shí)候就為null。getParamenter其實(shí)第一次也是從http body里面讀取一次顷牌。所以剪芍,如果getParamenter如果發(fā)生在getInputStream之后,那么getParamenter是沒(méi)有值的窟蓝。但是也明顯不是這個(gè)原因罪裹。因?yàn)椋绦蛑笆呛玫模竺媾既话l(fā)生的這個(gè)問(wèn)題状共。為了驗(yàn)證這個(gè)套耕,我還在getParamenter之后打印了http body里面的內(nèi)容。沒(méi)有問(wèn)題峡继。如果真的需要多次調(diào)用getInputStream冯袍,可以通過(guò)重寫(xiě)HttpServletRequestWrapper來(lái)實(shí)現(xiàn)這個(gè)。推薦一篇博客
System.out.println(getRequestBody(request.getInputStream()));
//獲取http body
private String getRequestBody(InputStream stream) {
String line = "";
StringBuilder body = new StringBuilder();
int counter = 0;
// 讀取POST提交的數(shù)據(jù)內(nèi)容
BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
try {
while ((line = reader.readLine()) != null) {
if (counter > 0) {
body.append("\r\n");
}
body.append(line);
counter++;
}
} catch (IOException e) {
e.printStackTrace();
}
return body.toString();
}
那么現(xiàn)在問(wèn)題來(lái)了碾牌,具體是什么原因呢康愤。之前用的tomcat8的容器,現(xiàn)在把tomcat8刪掉小染,換一個(gè)tomcat7翘瓮。一切正常贮折,post請(qǐng)求能正常接收裤翩。那肯定是tomcat的配置錯(cuò)了。經(jīng)過(guò)仔細(xì)比對(duì)调榄,終于發(fā)現(xiàn)了問(wèn)題的所在踊赠。之前為了上傳文件,設(shè)置了取消post請(qǐng)求限制maxPostSize=0每庆。但是筐带,tomcat8以后,maxPostSize必須小于0才能關(guān)閉post請(qǐng)求大小的限制缤灵。所以把maxPostSize的值改為-1就正常了伦籍。
<Connector connectionTimeout="20000" maxPostSize="-1" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
有時(shí)候,在解決一個(gè)問(wèn)題的過(guò)程中腮出,往往會(huì)讓你對(duì)某個(gè)技術(shù)點(diǎn)有更深入的了解帖鸦。所以,不要怕遇到問(wèn)題胚嘲,重要的是遇到問(wèn)題后能形成解決問(wèn)題的思路作儿。