隐藏域实现会话管理概述
如果你正在制作一个网络问卷,由于问卷内容很长,因此必须分几个页面,上一页面作答完后,必须请求服务器显示下一个页面。
但是在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); } }
响应结果及填写表单过程
第一次响应及表单填写
第二次响应及表单填写
第三次响应