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);
    }
} 
复制代码

响应结果及填写表单过程


 第一次响应及表单填写



 第二次响应及表单填写


第三次响应

posted @   zhuangrunwei  阅读(230)  评论(0编辑  收藏  举报
编辑推荐:
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
阅读排行:
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!
· 用 C# 插值字符串处理器写一个 sscanf
点击右上角即可分享
微信分享提示