Servlet-隱藏域簡析

Web容器

在這裏插入圖片描述
如上圖所示,簡單的展示了web服務器的一次服務過程:響應瀏覽器的請求。每次請求-響應過程於web服務器來都是一次新工作,即web服務器並不會記憶每次的請求響應過程。基於此性質,不難發現:若一次請求包含多個頁面,且頁面之間存在聯繫,則每次請求-響應過程中頁面之間的聯繫將不復存在,因爲web服務器沒有記憶功能(每次請求-響應都是一次新工作)。

隱藏域

若我們想要保留頁面之間的聯繫,該怎麼辦?我們可以藉助隱藏域完成期間的工作。
看一下百度給隱藏域的定義:
隱藏域是用來收集或發送信息的不可見元素,對於網頁的訪問者來說,隱藏域是看不見的。當表單被提交時,隱藏域就會將信息用你設置時定義的名稱和值發送到服務器上。
看完上述描述,不難有所疑惑。接下來,我們以一個例子來探究隱藏域究竟是什麼。

探究隱藏域

例子引入:設問卷調查問題太多需要三個頁面展示,其中第一二頁面展示問題,第三頁面顯示輸入的結果。第二個頁面也就需要攜帶第一個頁面的結果,第三個頁面獲取第二個頁面的結果。如下圖所示:
在這裏插入圖片描述
首先向服務器發送進入問卷調查的請求,服務器響應頁面一,填寫完畢後,向服務器提交page2請求,服務器響應頁面二,頁面二內容填寫完畢,發送請求page3請求。
代碼示例:

@WebServlet("/hidden")
public class HiddenAreaTest extends HttpServlet {
 	private static final long serialVersionUID = 1L;
 	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  		PrintWriter p = response.getWriter();
  		p.println("<form action=\"hidden\" method=\"Get\">");
  		String page = request.getParameter("page");
  		if(page.equals("page1")) {
   			pageA(request, p);
  		} else if(page.equals("page2")) {
   			pageB(request, p);
  		} else if(page.equals("finish")) {
   			pageC(request, p);
  		}
  		p.println("</form>");
 	}
 	private void pageA(HttpServletRequest request, PrintWriter p) {
  		p.println("A: <input type=\"text\" name=\"pAq1\"><br>");
  		p.println("B: <input type=\"text\" name=\"pAq2\"><br>");
  		p.println("<input type=\"submit\" name=\"page\" value=\"page2\"><br>");
 	}
 	private void pageB(HttpServletRequest request, PrintWriter p) {
 		String pAq1 = request.getParameter("pAq1");
  		String pAq2 = request.getParameter("pAq2");
  		p.println("C: <input type=\"text\" name=\"pBq1\"><br>");
  		p.printf("<input type=\"hidden\" name=\"pAq1\" value=\"%s\">%n", pAq1);
  		p.printf("<input type=\"hidden\" name=\"pAq2\" value=\"%s\">%n", pAq2);
  		p.println("<input type=\"submit\" name=\"page\" value=\"finish\">");
 	}
 	private void pageC(HttpServletRequest request, PrintWriter p) {
  		p.println(request.getParameter("pAq1") + "<br>");
  		p.println(request.getParameter("pAq2") + "<br>");
  		p.println(request.getParameter("pBq1") + "<br>");
 	}
}

前端:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
	<title>隱藏域實踐</title>
</head>
<body>
 	<form action="hidden" method="Get">
 		<input type="submit" name="page" value="page1"><br>
 	</form>
</body>
</html>

測試一下:
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
查看上述界面的源:
在這裏插入圖片描述
可以發現一下兩段內容:
在這裏插入圖片描述
這不是頁面一的結果嗎?其作爲隱藏內容被攜帶到頁面二。經過上述分析不難理解隱藏域是怎麼一回事。但是隱藏域問題也比較明顯,內容可以直接查看,因此安全性較差!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章