2017-04-20 31 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%正確地完成這項工作 –

相關問題