zoukankan      html  css  js  c++  java
  • 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);
        }
    } 

    响应结果及填写表单过程


     第一次响应及表单填写



     第二次响应及表单填写


    第三次响应

  • 相关阅读:
    陷阱~关于引用类型,请不要模棱两可!
    网络,请你远离人类吧!
    陷阱~SQL全表扫描与聚集索引扫描
    EF架构~对AutoMapper实体映射的扩展
    hdu 4557 非诚勿扰 vector的应用 原来vector 可以删除指定位置元素 不过消耗大
    POJ---2243 Knight Moves 使用A*算法的广度优先搜索
    Java贪吃蛇游戏
    【编程范式】 编译原理相关内存分配
    栅格数据空间分析之四基于栅格数据空间分析的选址
    ECLIPSE中反编译插件JAD的配置安装,轻松查看JAVA源代码
  • 原文地址:https://www.cnblogs.com/Mike_Chang/p/10053462.html
Copyright © 2011-2022 走看看