hidden field implements session
阿新 • • 發佈:2018-12-02
隱藏域實現會話管理概述
如果你正在製作一個網路問卷,由於問卷內容很長,因此必須分幾個頁面,上一頁面作答完後,必須請求伺服器顯示下一個頁面。
但是在HTTP協議中,伺服器並不會記得上一次請求的狀態。既然伺服器不會記得兩次請求間的關係,那就由伺服器將上一頁結果以隱藏域的方式響應給瀏覽器,而瀏覽器在每次請求時通過隱藏域“主動告知”伺服器多次請求間必要的資訊。
這樣每一頁的問卷答案就可以保留下來。
缺點
1、使用隱藏域的方式,如果使用post提交,在關掉網頁後,顯然會遺失先前請求的資訊,所以僅適合用於一些簡單的狀態管理,如線上問卷。
2、由於在檢視網頁原始碼時,就可以看到隱藏域的值,因此這個方法不適合用於隱密性較高的資料。
example
package com.test; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; @WebServlet("/questionnaire") public class Questionnaire extends HttpServlet { protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); PrintWriter out= response.getWriter(); out.println("<!DOCTYPE html>"); out.println("<html>"); out.println("<head>"); out.println("<meta charset='UTF-8'>"); out.println("<title>問卷調查</title>"); out.println("</head>"); out.println("<body>"); String page = request.getParameter("page"); out.println("<form action='questionnaire' method='get'>"); if(page == null) { // 第一頁問卷 out.println("問題一:<input type='text' name='p1q1'><br>"); out.println("問題二:<input type='text' name='p1q2'><br>"); out.println("<input type='submit' name='page' value='page2'>"); } else if("page2".equals(page)) { // 第二頁問卷 String p1q1 = request.getParameter("p1q1"); String p1q2 = request.getParameter("p1q2"); out.println("問題三:<input type='text' name='p2q1'><br>"); out.printf("<input type='hidden' name='p1q1' value='%s'>%n", p1q1); out.printf("<input type='hidden' name='p1q2' value='%s'>%n", p1q2); out.println("<input type='submit' name='page' value='finish'>"); } else if("finish".equals(page)) { // 最後答案收集 out.println(request.getParameter("p1q1") + "<br>"); out.println(request.getParameter("p1q2") + "<br>"); out.println(request.getParameter("p2q1") + "<br>"); } out.println("</form>"); out.println("</body>"); out.println("</html>"); } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } }
響應結果及填寫表單過程
第一次響應及表單填寫
第二次響應及表單填寫
第三次響應