今天是2018年9月7日
晚一點(diǎn)看完比賽突然想起來URL傳參的問題。
當(dāng)頁面使用URL傳參時(shí)翎迁,可以在瀏覽器通過修改URL來達(dá)成修改傳參的效果,對(duì)于某些要插入到數(shù)據(jù)庫的操作忌卤,這樣的現(xiàn)象就略微有些危險(xiǎn)了研侣。雖然能使用
doPost()
方法不再在URL中顯示傳遞的參數(shù)谱邪,但是通過嘗試我發(fā)現(xiàn),在已知參數(shù)名的情況下庶诡,依然可以通過URL進(jìn)行參數(shù)的修改惦银。
分析:
其實(shí)很容易明白,不過在頁面中我是使用了url?arg=
的方式末誓,還是利用form-submit
的方式扯俱,最終使用的都是request.getParameter()
在頁面開始前獲取參數(shù),而后在URL中傳遞的參數(shù)都會(huì)再次觸發(fā)request.getParameter()
從而覆蓋掉之前的數(shù)據(jù)基显。
思考:
在明白了以上內(nèi)容后蘸吓,我嘗試使用重定向response.sendRedirect()
方法在不修改URL的情況下重定向善炫,繼而發(fā)現(xiàn)這樣依然避免不了在新的頁面使用request.getParameter()
方法來獲取上一個(gè)頁面中的內(nèi)容撩幽。
聯(lián)想到上一次的驗(yàn)證碼,我想到了使用
Session
來嘗試在新的頁面直接由Session
獲取隱私數(shù)據(jù)箩艺,而不再使用這種傳參方式窜醉。
困難:
然而很快我就發(fā)現(xiàn)這種想法的實(shí)現(xiàn)似乎有些難度,主要問題在于艺谆,我似乎沒有辦法把當(dāng)前頁面用戶填寫的數(shù)據(jù)馬上獲取后存入Session
中榨惰,獲取當(dāng)前頁面用戶填寫的內(nèi)容的方法我能想到的是JavaScript
的document.getElementById()
函數(shù),而這個(gè)數(shù)據(jù)我并沒有辦法將其存入Session
中静汤。
解決:
之后我想到了使用Servlet
嘗試完成琅催,創(chuàng)建了用于測試的TestServlet
類,重寫了其doPost()
方法虫给,同時(shí)也將doGet()
方法默認(rèn)為doPost()
方法藤抡。
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
String c=request.getParameter("c");
request.getSession().setAttribute("c_val",c);
response.sendRedirect("../index4.jsp");
}
此處遇到了一個(gè)問題:在Servlet中轉(zhuǎn)發(fā)/重定向的文件路徑與jsp中并不相同哼审,如上代碼中荷腊,如果單填寫index4.jsp
是無法訪問的,會(huì)404妻味。在查閱了相關(guān)資料后發(fā)現(xiàn)要寫../index4.jsp
配置web.xml
<servlet>
<servlet-name>TestServlet</servlet-name>
<servlet-class>com.YuChi.TestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>/servlet/TestServlet</url-pattern>
</servlet-mapping>
運(yùn)行
直接訪問
url修改