【问题标题】:How to call java code and javascript code in the same form with jsp如何用jsp以相同的形式调用java代码和javascript代码
【发布时间】:2016-08-24 08:13:00
【问题描述】:

所以我目前有一个问题,我有一个包含两个用户名和密码输入的表单,一个验证码 (<div>) 和一个 submit 类型的 input,用作按钮。当这个提交按钮被点击时,我希望它检查验证码以查看它是否为空。如果它不为空,我希望它调用其他验证用户的 java 代码。

我的 jsp 表单如下所示:

<html>
  <head>
    <!-- more scripts / google api js are here -->
    <script type="text/javascript">
      function get_action(form) {
        var v = grecaptcha.getResponse();
        if(v.length === 0) {
           document.getElementById('captcha').innerHTML="Login failed: Empty captcha";
           return false;
        } else { 
           return true; 
        }
      }
    </script>
  </head>
  <body>
    <form action="login" method="post" onsubmit="return get_action(this);">
       <input type="text" id="email" value="${fn:escapeXml(param.email)}" required>
       <input type="text" id="password" value="${fn:escapeXml(param.password)}" required>
       <div class="g-recaptcha" data-sitekey="xxx"></div>
       <input class="submit_button" type="submit" name="submit" value="Submit" />
       <span class="error"${error.invalid}</span>
       <div id="captcha" class="captchaError"></div>
    </form>
  </body>
</html>

我的登录 servlet 应该进行用户验证如下:

@WebServlet("/login")
public class LoginServlet extends HttpServlet {

    private LoginDAO loginDAO;

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        request.getRequestDispatcher("login.jsp").forward(request,response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        Map<String, String> error = new HashMap<String,String>();
        request.setAttribute("error",error);

        String email = request.getParameter("email");
        String password = request.getParameter("password");

        // Verify re-captcha
        String gRecaptchaResponse = request.getParameter("captcha");
        boolean verify = VerifyRecaptcha.verify(gRecaptchaResponse);
        if(!verify) {
            error.put("captcha","You seem to be a robot. Try to use the captcha again");
        }
        if(error.isEmpty()) {
            loginDAO = new LoginDAO();
            try {
                List<Customer> customer = new ArrayList<Customer>();
                customer = loginDAO.validate(email,password);
                if(customer.isEmpty()) {
                    error.put("invalid","Invalid email or password");
                }
                if(error.isEmpty()) { // no errors, proceed
                    HttpSession session = request.getSession(true);
                    Customer user = customer.get(0);
                    session.setAttribute("user",user);
                    response.sendRedirect("main");
                    return;
                }
                request.getRequestDispatcher("login").forward(request,response);
            } catch(SQLException e) {
                throw new ServletException("Could not check login",e);
            }
            loginDAO.closeLoginDAO();
        }
    }
}

loginDAO 只是根据数据库检查用户名和密码。

奇怪的是昨晚一切正常。我唯一做的就是将 java 文件移动到子目录中。但我更新了web.xml 文件以确保没有任何问题。

现在我感觉formonsubmit= 部分与java 类搞混了。有谁知道正确的做法是使用 javascript 和 java 进行表单验证?不幸的是,我需要某种用于 reCaptcha 的 javascript,否则用户可以提交一个空的验证码。

【问题讨论】:

  • doGet(),你转发到login.jsp。在doPost() 中,您转发到login。不确定这是否是问题中的错字,但可能会导致问题。旁注:在进行转发或重定向之前,请注意关闭您的 loginDAO 资源。

标签: javascript java forms jsp captcha


【解决方案1】:

在你的jsp文件var v = grecaptcha.getResponse();中,你丢失了grecaptcha的定义,这会导致错误。

【讨论】:

  • 它似乎没有任何影响。我的意思是它仍然进入一个空白页面。在 chrome 中检查页面也不会显示 javascript 部分的任何错误。
猜你喜欢
  • 1970-01-01
  • 2010-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-27
  • 1970-01-01
  • 2012-07-29
  • 2017-02-10
相关资源
最近更新 更多