1. 程式人生 > >hidden field implements session

hidden field implements session

隱藏域實現會話管理概述

  如果你正在製作一個網路問卷,由於問卷內容很長,因此必須分幾個頁面,上一頁面作答完後,必須請求伺服器顯示下一個頁面。
  但是在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); } }

響應結果及填寫表單過程


 第一次響應及表單填寫



 第二次響應及表單填寫


第三次響應