2017-02-22 62 views
0

我有一個表單將POST請求提交給由@WebServlet("/SignUp")定義的servlet。Java servlet重定向有錯誤的URL並使用錯誤的HTTP方法

我也有客戶端檢查,以確保所有的表單輸入已填充,但如果他們潛入並提交與空輸入的表單,我想servlet發送它們返回/Home(即index.jsp)作爲後備。

我有我的註冊servlet的的doPost()以下:

protected void doPost(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
    final String METHODNAME = "doGet"; 
    logger.entering(CLASSNAME, METHODNAME); 

    String email = request.getParameter("email"); 
    String pass = request.getParameter("password"); 
    String cpass = request.getParameter("confirmPassword"); 

    String forwardJsp = ""; 
    if (StringUtils.isNotBlank(email) && StringUtils.isNotBlank(pass) 
      && StringUtils.isNotBlank(cpass)) { 
     forwardJsp = "/SignUpMoreInfo.jsp"; 
    } else { 
     // one of the fields was empty 
     request.setAttribute("signupFieldWasEmpty", true); 

     forwardJsp = "/Home"; 
    } 

    request.getRequestDispatcher(forwardJsp).forward(request, response); 
    logger.exiting(CLASSNAME, METHODNAME); 
} 

在基層工作的。如果他們忽略輸入一個值(我還沒有做任何真正的檢查,比如.trim()或無效字符),那麼它們將被髮送回index.jsp(由/ Home Servlet支持)。

但是,我有兩個問題與我的代碼的工作方式,我不知道如何解決它們。

  1. 我的index.jsp現在被加載爲POST請求,而不是通常的GET。如果用戶刷新頁面,他們會得到一個客戶端警告,提醒用戶在POST請求中刷新頁面,這在主頁上確實很醜陋。

  2. 瀏覽器中的URL仍然有地址http://localhost:8080/SignUp,當時我期待它是http://localhost:8080/Home。這對用戶來說也是醜陋和令人困惑的,因爲url不再正確地代表他們與網站的「主頁」頁面關聯的頁面。

如何在保留儘可能多的MVC的同時,解決這些問題以及我的Java後端代碼?

+0

你是否考慮過不使用提交按鈕,而是使用Javascript進行提交,這樣你就可以在客戶端執行驗證。如果他們在瀏覽器之外進行POST,然後在doPost中捕獲它,然後返回500錯誤,那麼我認爲 –

回答

1

你必須使用重定向這裏,而不是開始一個新的請求/home

試試這個:

if (StringUtils.isNotBlank(email) && StringUtils.isNotBlank(pass) && StringUtils.isNotBlank(cpass)) { 

    forwardJsp = "/SignUpMoreInfo.jsp"; 

} else { 

    request.setAttribute("signupFieldWasEmpty", true); 

    response.sendRedirect("/Home"); 
} 

但是現在的問題是,你將失去此信息signupFieldWasEmpty所以如果你想保持它,你必須作爲請求PARAM添加到URI:

else { 

    response.sendRedirect("/Home?signupFieldWasEmpty=true"); 

} 
0

可以使用Post/Redirect/Get模式avoi d這個問題。

servlet收到Post請求,處理表單,然後發送重定向到所需的頁面。