2017-04-20 32 views
1

我有一个简单的GWT登录表单和一个用于简单用户登录的java servlet。我正在使用表单提交完成事件来处理响应,而无需重定向到操作目标URL,并且我想在客户端处理答案(密码不正确或全部为OK或任何其他自定义行为),然后采取适当的措施。如果登录无误,那么浏览器应该要求记住用户名和密码。GWT - 登录表单 - 如果用户/密码不正确,浏览器总是要求记住密码事件

问题是,对于每个响应,无论用户名+密码组合是否正确,浏览器总是要求记住它们。 有什么建议吗?我不想加载另一个页面,因为我想保持相同的GWT状态。我也尝试发送响应代码400或401,但它不起作用(在Chrome中测试)。

见下面的代码:

GWT onModuleLoad():

 final FormPanel formPanel = new FormPanel(); 
     formPanel.setEncoding(FormPanel.ENCODING_URLENCODED); 
     formPanel.setMethod(FormPanel.METHOD_POST); 

     VerticalPanel verticalPanel = new VerticalPanel(); 
     verticalPanel.add(new Label("Username")); 
     TextBox userid = new TextBox(); 
     userid.setName("username"); 
     verticalPanel.add(userid); 

     verticalPanel.add(new Label("Password")); 
     PasswordTextBox passwd = new PasswordTextBox(); 
     passwd.setName("password"); 
     verticalPanel.add(passwd); 

     verticalPanel.add(new Button("Submit", new ClickHandler() { 

      @Override 
       public void onClick(ClickEvent event) { 
      formPanel.submit(); 
      } 
     })); 

     formPanel.add(verticalPanel); 

     formPanel.setAction("/login"); 

     formPanel.addSubmitHandler(new FormPanel.SubmitHandler() { 
      public void onSubmit(SubmitEvent event) { 
      } 
     }); 
     formPanel.addSubmitCompleteHandler(new FormPanel.SubmitCompleteHandler() { 
      public void onSubmitComplete(SubmitCompleteEvent event) { 
       GWT.log(event.getResults()); 
      } 
     }); 

     RootPanel.get().add(formPanel); 

Java Servlet的测试:

@Override 
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
     String username = req.getParameter("username"); 
     String password = req.getParameter("password"); 
     resp.setContentType("text/plain"); 

     System.out.println("Login request for " + username + "/" + password); 
     if (username.equals("test1234")) { 
      // send test response to output 
      printMessageToOutputStream(resp, "OK", true, true); 
     } 
     else { 
      resp.setStatus(HttpServletResponse.SC_FORBIDDEN); // not working for 400,401,403 
      printMessageToOutputStream(resp, "NOK", false , true); 
     } 
    } 

编辑: 我也试过状态403(禁止),它不工作(我更新了代码段)

回答

0

好像你总是会返回一个200的http代码,导致浏览器认为即使密码错误,一切正常。

我定你的代码片段:

@Override 
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
    String username = req.getParameter("username"); 
    String password = req.getParameter("password"); 
    resp.setContentType("text/plain"); 

    System.out.println("Login request for " + username + "/" + password); 
    if (username.equals("test1234")) { 
     // send test response to output 
     printMessageToOutputStream(resp, "OK", true, true); 
    } 
    else { 
     // Hey browser, authentication failed 
     resp.setStatus(HttpServletResponse.SC_FORBIDDEN); 
     printMessageToOutputStream(resp, "NOK", false , true); 
    } 
} 
+0

不工作要么。 (在Chrome上进行了测试 - 也使用了代码400,401) –

+0

这是一个非解决方案,但为什么不使用表单提交,而是不使用真棒gwt客户机 - 服务器机制?会让你的生活更轻松并解决问题。指南:http://www.gwtproject.org/doc/latest/DevGuideServerCommunication.html –

+0

我也试过,但浏览器在使用AJAX时表现得非常奇怪。例如,使用RPC,除非您强制提交表单,否则不会触发记住密码弹出窗口。此外,它不适用于Chrome,IO(例如iPhone),并且当您键入用户名的第一部分以查看建议并选择它(或在桌面上按Enter时),浏览器会要求记住一半的密码用户名(尽管您之前选择记住完整的用户名)。所以我不能100%正确地完成这项工作 –

相关问题