【问题标题】:servlet, tracking session with hidden parametersservlet,使用隐藏参数跟踪会话
【发布时间】:2018-03-22 13:53:30
【问题描述】:

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

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

这是我的 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>

我不明白问题出在哪里。你能帮助我吗?非常感谢!

【问题讨论】:

    标签: java html http tomcat servlets


    【解决方案1】:

    hiddenParameters 犯了这种行为,因为它的范围不好。看看这个answer 以获得更多解释。

    【讨论】:

    • 是的!这里最大的错误是尝试使用一种既不想记住任何数据,也不想记住服务器或客户端的方法来记住 Web 服务器上的数据。非常感谢您的帮助!
    • 不客气。是的,从设计上来说它很糟糕,但作为一个练习,它可以帮助了解事情是如何工作的,以及什么是好的/安全的设计。
    猜你喜欢
    • 1970-01-01
    • 2013-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-21
    • 2014-04-25
    • 2018-02-05
    • 1970-01-01
    相关资源
    最近更新 更多