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