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