當(dāng)當(dāng)網(wǎng)問(wèn)題get_post問(wèn)題
Posted on 2012-11-09 15:49 志成中國(guó) 閱讀(1207) 評(píng)論(0) 編輯 收藏GET與Post提交問(wèn)題:
----------------------------------------------
運(yùn)行l(wèi)ogin.jsp點(diǎn)登陸時(shí)調(diào)用兩次toLoginAction
/WEB-INF/jsp/main/main.jsp
/WEB-INF/jsp/user/login_form.jsp
所以取得結(jié)果在toLoginAction的execute里運(yùn)行兩次
String pass = iuserDao.findPassWordByEmail(email);
System.out.println(email);
System.out.println(pass);
也輸出兩次:條件不同,輸出內(nèi)容不同
當(dāng)login_form.jsp里的表單
使用post方式提交時(shí),控制臺(tái)輸出如下:
root@root.com
root
null
null
當(dāng)login_form.jsp里的表單
使用get方式提交時(shí),控制臺(tái)輸出如下:
root@root.com
root
root@root.com
root
解決方案一:加struts的token攔截器,只讓表單提交一次。
解決方案二:轉(zhuǎn)一個(gè)action,就是把他自動(dòng)提交的那個(gè)請(qǐng)求通過(guò)action的轉(zhuǎn)發(fā)取消掉。
問(wèn)題:
為什么get和post的默認(rèn)請(qǐng)求后取到的值會(huì)不同?
為什么在window的電腦里沒(méi)有問(wèn)題?
----------------------------------------------
在window下,正常輸出如下:
root@root.com
root
----------------------------------------------
緩存問(wèn)題(服務(wù)器緩存或者瀏覽器緩存或者瀏覽器bug),導(dǎo)致提交兩次,與操作系統(tǒng)、程序、js提交是沒(méi)關(guān)系!
get:通過(guò)URL路傳參,當(dāng)頁(yè)面再次提交,還會(huì)把URL中的值傳遞給action,所有屬性再次被填充就不出現(xiàn)null值
post:URL路徑?jīng)]有信息,當(dāng)再次提交,就出現(xiàn)屬性就出現(xiàn)null值
你在學(xué)生機(jī)器上,把在tomcat中work目錄刪除、在把\webapps 中項(xiàng)目刪除,把web容器緩存清空下!
或者把學(xué)生機(jī)器重新啟動(dòng)下,把服務(wù)器緩存徹底清除下!
----------------------------------------------
----------------------------------------------
圖片:struts-user.xml配置如下:
----------------------------------------------
ToLoginAction類如下
:
----------------------------------------------
進(jìn)入主頁(yè)面的URL如:
----------------------------------------------
登陸的URL如:
----------------------------------------------
登陸界面:
----------------------------------------------
windwo系統(tǒng)下提交輸出如圖:
----------------------------------------------
Linux系統(tǒng)下,采用get提交時(shí)
----------------------------------------------
Linux系統(tǒng)下,采用post提交時(shí)
----------------------------------------------
最后在學(xué)生電腦上又試了幾次,get方式提交正常和window系統(tǒng)下一樣了,post方式
提交還是沒(méi)改變,不知道為什么。
----------------------------------------------
郵件內(nèi)容如下:
發(fā)件人:賈東坡
發(fā)送時(shí)間: 2012-11-08 09:37
收件人:zhaozq
主題: dang_get_post
趙老師:
您好。學(xué)生的程序有點(diǎn)問(wèn)題,想聽(tīng)一下您的理解。問(wèn)題描述如下:
進(jìn)入當(dāng)當(dāng)網(wǎng)的main頁(yè)面,點(diǎn)登陸輸入用戶名,密碼后,點(diǎn)登陸會(huì)請(qǐng)求ToLoginAction,
進(jìn)入main頁(yè)面。在ToLoginAction里打印了email和pass,登陸之后輸出結(jié)果在linux
系統(tǒng)下與window下不同。window系統(tǒng)下正常輸出,而在linux系統(tǒng)下有輸出兩次,并且
login_form.jsp時(shí)表單提交方法為get時(shí),兩次都能正常輸出;當(dāng)提交方式為post里,第
二次為null。例如:
在window系統(tǒng)下:
我們?cè)谳斎肟颍斎胗脩裘簉oot@qq.com 密碼root,會(huì)輸出如下:
root@qq.com
root
在linux系統(tǒng)下
當(dāng)login_form.jsp的表單提交為get時(shí),輸出root@qq.comroot時(shí),
輸出如下:
root@qq.com
root
root@qq.com
root
當(dāng)login_form.jsp的表單提交為post時(shí),輸入root@qq.comroot時(shí),
輸出如下:
root@qq.com
root
null
null
原因分析:首先想的是submit按鈕在使用js時(shí),有自動(dòng)提交功能,可是也沒(méi)使用js啊,
還有在linux系統(tǒng)有自己的form機(jī)制。還有一個(gè)是程序有問(wèn)題。
解決方案:我給這個(gè)action加了個(gè)token表單攔截器就可以。說(shuō)明是表單提交兩次。
問(wèn)題是:1.為什么表單會(huì)提交兩次,而在window下只提交一個(gè)。
2.為什么在linux下用get和post提交方式第二次取到的值會(huì)不一樣。
3. form提交時(shí)在linux系統(tǒng)下與window有什么不一樣。
附件內(nèi)是程序源碼,謝謝您的寶貴時(shí)間。
祝: 身體健康,工作順利!
賈東坡北方區(qū) 北方基地項(xiàng)目部 項(xiàng)目經(jīng)理
E-mail: jiadp@tarena.com.cn
Address: 北京市昌平區(qū)北七家鎮(zhèn)宏富創(chuàng)業(yè)園科技園綜合樓3層
Mobile: 18301442726
Fax: 86-10-82823773
Website: www.tarena.com.cn
----------------------------------------------
發(fā)件人:zhaozq
發(fā)送時(shí)間: 2012-11-08 11:21
收件人:jiadp
主題: 回復(fù): dang_get_post
賈老師:
您好!
你們班的學(xué)生機(jī)器是不是采用的是云服務(wù)器?
zhaozq
----------------------------------------------
趙老師:
您好。我們班的機(jī)器都是普通主機(jī),linux系統(tǒng)的,不是用核的,也不是云服務(wù)器。
謝謝您的寶貴時(shí)間。
----------------------------------------------
賈老師:
您好!
緩存問(wèn)題(服務(wù)器緩存或者瀏覽器緩存或者瀏覽器bug),導(dǎo)致提交兩次,與操作系統(tǒng)、程序、js提交是沒(méi)關(guān)系!
get:通過(guò)URL路傳參,當(dāng)頁(yè)面再次提交,還會(huì)把URL中的值傳遞給action,所有屬性再次被填充就不出現(xiàn)null值
post:URL路徑?jīng)]有信息,當(dāng)再次提交,就出現(xiàn)屬性就出現(xiàn)null值
你在學(xué)生機(jī)器上,把在tomcat中work目錄刪除、在把\webapps 中項(xiàng)目刪除,把web容器緩存清空下!
或者把學(xué)生機(jī)器重新啟動(dòng)下,把服務(wù)器緩存徹底清除下!
zhaozq
----------------------------------------------
趙老師:
您好。您的分析很有道理,可是我用另外幾臺(tái)電腦,試了也不行,所以不該是緩存問(wèn)題。
瀏覽器bug,這個(gè)還沒(méi)測(cè)試,因?yàn)樗袑W(xué)生的電腦都是同樣的系統(tǒng),同樣的瀏覽器,都是這個(gè)
情況。要是緩存問(wèn)題,怎么可能用token攔截了,攔截下的是緩存的,還是我自己提交的,以及
在哪地方緩存。還有個(gè)問(wèn)題就是,在web學(xué)習(xí)的時(shí)候也有表單提交,為什么就沒(méi)有這種情況,是
不是和struts有關(guān)。
謝謝,您的寶貴時(shí)間。
----------------------------------------------
趙老師回復(fù):
您好。您的分析很有道理,可是我用另外幾臺(tái)電腦,試了也不行,所以不該是緩存問(wèn)題。
瀏覽器bug,這個(gè)還沒(méi)測(cè)試,因?yàn)樗袑W(xué)生的電腦都是同樣的系統(tǒng),同樣的瀏覽器,都是這個(gè)
情況。要是緩存問(wèn)題,怎么可能用token攔截了,攔截下的是緩存的,還是我自己提交的,以及
token不是攔截了,而是令牌值相同不在提交,不是在window 系統(tǒng)提交沒(méi)問(wèn)題嗎?那就與程序無(wú)關(guān)了,那就是系統(tǒng)
緩存或者瀏覽器緩存中,正常當(dāng)瀏覽器關(guān)閉,緩存中數(shù)據(jù)就清除,但是如果機(jī)房比較熱、服務(wù)器處于長(zhǎng)期運(yùn)營(yíng)等情況都會(huì)導(dǎo)致緩存信息無(wú)法清空,而影響程序執(zhí)行
在哪地方緩存。還有個(gè)問(wèn)題就是,在web學(xué)習(xí)的時(shí)候也有表單提交,為什么就沒(méi)有這種情況,是
緩存
不是和struts有關(guān)。
和struts沒(méi)有關(guān)系,而是與計(jì)算機(jī)硬件設(shè)備有關(guān),這個(gè)影響具體什么時(shí)候會(huì)造成,這個(gè)都不能預(yù)計(jì),這種情況一般比較少見(jiàn)。
祝: 身體健康,工作順利!
----------------------------------------------
趙老師:
您好。謝謝您的詳細(xì)解答,真是受益匪淺,這個(gè)問(wèn)題可以劃上句話了。同學(xué)們都很喜歡聽(tīng)
您講課,風(fēng)趣幽默、也易于接受,期待您更多的講解。
謝謝,您的精神講解。您辛苦了。
祝: 身體健康,工作順利!
----------------------------------------------
----------------------------------------------
Debug linux系統(tǒng)下截圖如下:
----------------------------------------------
get方式時(shí):正常情況下:輸出和win一樣了。
root@root.com
root
----------------------------------------------
post方式時(shí):輸出如下:
root@root.com
root
null
null
-------------------------------------------------------------------------------------------