• Servlet中表单的重复提交


    1.用户登录页面:

      ->设置一个UUID到session中

      ->将UUID添加到隐藏域中,提交到服务器

    <%
    //进入页面,设置一个UUID,将UUID添加到session中
     String token=UUID.randomUUID().toString();
     session.setAttribute("token", token); 
     %>
    
    <form action="userlogin" method="POST"  >
        <!-- 定义一个隐藏域,将设置的Session对象UUID提交上去 -->
        <input type="hidden" value="${token}" name="token">
        用户名:<input type="text" name="username" placeholder="请输入用户名" required /><br/><br/>
        密 码:<input type="password" name="password" placeholder="请输入密码" required /><br/><br/>
        <input type="submit" value="登录"/>
    </form>

    2.服务器端:

      -->拿到面页传过来隐藏表单里面的token和session里面的token

      -->判断两个token是否相等,假如相等,先将之前页面上设置的session移除,再进行业务处理

      -->注意:这里移除session并不是页面中的隐藏域不会传token过来,只是穿过来的token和第一次穿过来的值不一样,这样,就避免了表单重复提交.

    具体代码如下:

    import java.io.IOException;
    import java.io.PrintWriter;
    
    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 javax.servlet.http.HttpSession;
    
    /**
     * 表单重复提交验证
     * 
     * @author Decepticon
     *
     */
    @WebServlet("/userlogin")
    public class SubmitValidate extends HttpServlet {
    
        private static final long serialVersionUID = 1L;
    
        @Override
        protected void service(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            // 获取到JSP隐藏表单里的token
            String token = request.getParameter("token");
            // 获取session对象
            HttpSession session = request.getSession();
            // 获取面页session中的token的值
            String sessionToken = (String) session.getAttribute("token");// 将面页传过来的隐藏表单中的token值和session中设置的token值做比较
                if (token.equals(sessionToken)) {
                    // 如果一样,移除面页的session值
                    request.getSession().removeAttribute("token");
                    PrintWriter writer = response.getWriter();
                    writer.write("HelloWorld!");
                    writer.close();
                } else {
                    PrintWriter writer = response.getWriter();
                    writer.write("Please don't always click");
                    writer.close();
                }
        }
    }
  • 相关阅读:
    程序活动记录&程序调试&多线程编程
    数据结构与算法
    C/C++
    Information Retrieval --- Retrieval Comment
    Information Retrieval --- Clustering
    Information Retrieval --- Classification
    Information Retrieval --- Web Search
    Information Retrieval --- Retrieval Enforce:Relevance Feedback & Query Expansion
    Information Retrieval --- Retrieval Model
    ubuntu server 安装vnc
  • 原文地址:https://www.cnblogs.com/zhang-bo/p/6516992.html
Copyright © 2020-2023  润新知