servlet,跟踪隐藏参数的会话

时间:2018-03-22 13:53:31

标签: java html http tomcat servlets

我在servlet编码方面遇到了麻烦,我不知道如何解决它。 我试图仅使用隐藏参数来跟踪会话(使用TomCat Web服务器)。 在此示例中,名称,姓氏和电子邮件作为参数。我的想法是每次只询问客户一个参数并将其作为隐藏参数发送给他(迭代)。

如果我只启动一个会话(因为当客户端发送第一个参数到客户端发送最后一个参数时),我的servlet工作正常。 问题是当我开始另一个会话时: 当我向服务器发送姓氏(与revious会话不同的值)时,服务器给我一个url,其中有两个隐藏参数" surname"使用当前姓氏的值和前一个姓氏的值。

这是我的servlet类:

    import javax.servlet.*;
    import javax.servlet.http.*;
    import java.io.*;
    import java.util.*;

    public class HiddenParamServlet extends HttpServlet {


        private final String[] PARAMS = { "name", "surname", "e-mail" }; 
        private Map<String, String> hiddenParameters;

        @Override
        public void init() {
            hiddenParameters = new HashMap<String, String>();
        }
        @Override
        public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

            response.setContentType("text/html");
            PrintWriter out = response.getWriter(); 

    // control the last parameter added by the client
            List<String> clientParameters =        Collections.list(request.getParameterNames());

    // checks if the client already sent all the parameters
            if(clientParameters.size() == 3) {
            // start the html document
                out.println("<html><head><title>Session finished</title></head>");
                out.println("<body><h1>Session succesfully completed</h1></body>");
                out.println("</html>");
            // end the html
                out.close();

                hiddenParameters.clear();
           }

           else {

              String lastParam = clientParameters.get(clientParameters.size() -1);
        //memorizing the last param sent by the client
              String value = request.getParameter(lastParam);
        hiddenParameters.put(lastParam, value);

        // starts the HTML document         
              out.println("<html>");
              out.println("<head><title>Tracking session with hidden parameters</title></head>");

              out.println("<body>");
              out.println("<form method=\"get\" action=\"/DirectoryDiSaluto/HiddenParamServlet\">");
        out.println("<p>");

        //write the next parameter to ask to the client
              out.println("<label>Insert "+PARAMS[clientParameters.size()]+":");

        // write the hidden parameters of the server
              for(String key : hiddenParameters.keySet()) {
                   out.println("<input type=\"hidden\" name=\""
            +key+"\" value=\""+hiddenParameters.get(key)+"\" />");
              }
              out.println("<input type=\"text\" name=\""+PARAMS[clientParameters.size()]+"\" />");
              out.println("<input type=\"submit\" value=\"Submit\" />");
              out.println("</label>");
              out.println("</p>");  
              out.println("</form>");
              out.println("</body>");
              out.println("</html>");
        // end the html

              out.close();
            }
         }

    }

以下是所有开始的html页面:

   <html>
      <head>
          <title>Tracking session with hidden parameters</title>
      </head>

      <body>

        <form method="get" action="/DirectoryDiSaluto/HiddenParamServlet">
            <p>
            <label>Insert name:
                <input type="text" name="name"/>
                <input type="submit" value="Submit" />
            </label>
           </p>
        </form>
      </body>
   </html>

我无法理解问题所在。你能帮助我吗?非常感谢!

1 个答案:

答案 0 :(得分:0)

hiddenParameters犯了这种行为,因为它的范围很差。请查看此answer以获取更多解释。