2017-07-27 87 views
1

我想驗證有關用戶的信息。如果用戶已進入並嘗試進入/login頁面,轉到用戶頁面。在結束方法doPost()運行方法doGet()而不在StartServlet中調用此方法

由於這一刻,我有這樣的:

StartServlet

public class StartServlet extends HttpServlet { 

    @Override 
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
     UserDTO userDTO = (UserDTO) req.getSession().getAttribute("userDTO"); 
     if (userDTO == null) { 
      req.getRequestDispatcher(req.getContextPath() + "/WEB-INF/pages/login.jspx").forward(req, resp); 
     } else { 
      req.getRequestDispatcher(req.getContextPath() + "/checklogin").forward(req, resp); 
     } 
    } 
} 

ValidateServlet

public class ValidateServlet extends HttpServlet { 
    @Override 
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
     String email = req.getParameter("email"); 
     String password = req.getParameter("password"); 
     UserDTO userDTO = (UserDTO) req.getSession().getAttribute("userDTO"); 

     if (userDTO == null) { 
      userDTO = UserService.getInstance().validateUserDTO(email, password); 
     } 

     if (userDTO != null) { 
      req.getSession().setAttribute("userDTO", userDTO); 
      if (userDTO.getRole() == Role.ADMINISTRATOR || userDTO.getRole() == Role.SUPERADMINISTRATOR) { 
       req.getRequestDispatcher(req.getContextPath() + "/admin/catalog").forward(req, resp); 
      } else { 
       req.getRequestDispatcher(req.getContextPath() + "/WEB-INF/pages/user/catalog/catalog.jspx").forward(req, resp); 
      } 
     } else { 
      String errorMsg = "Email or password is incorrect"; 
      req.setAttribute("error", errorMsg); 
      req.getRequestDispatcher(req.getContextPath() + "/WEB-INF/pages/login.jspx").forward(req, resp); 
     } 
    } 

    @Override 
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
     doPost(req, resp); 
    } 
} 

AdminCatalogServlet

public class AdminCatalogServlet extends HttpServlet { 

    @Override 
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
     List<ItemDTO> itemsDTO = ItemService.getInstance().getAllItemsDTO(); 
     req.setAttribute("itemsDTO", itemsDTO); 
     req.getRequestDispatcher(req.getContextPath() + "/WEB-INF/pages/admin/catalog/catalog.jspx").forward(req, resp); 
    } 

    @Override 
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
     doPost(req, resp); 
    } 
} 

的web.xml

<servlet> 
     <servlet-name>StartServlet</servlet-name> 
     <servlet-class>...StartServlet</servlet-class> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>StartServlet</servlet-name> 
     <url-pattern>/</url-pattern> 
     <url-pattern>/login</url-pattern> 
    </servlet-mapping> 
    <servlet> 
     <servlet-name>ValidateServlet</servlet-name> 
     <servlet-class>...ValidateServlet</servlet-class> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>ValidateServlet</servlet-name> 
     <url-pattern>/checklogin</url-pattern> 
    </servlet-mapping> 
<servlet> 
     <servlet-name>AdminCatalogServlet</servlet-name> 
     <servlet-class>...AdminCatalogServlet</servlet-class> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>AdminCatalogServlet</servlet-name> 
     <url-pattern>/admin/catalog</url-pattern> 
    </servlet-mapping> 

問題:我們從StartServlet,呼籲//login時開始。然後我們輸入登錄名,密碼形成(方法= POST)並提交至ValidateServlet

之後,我們轉發到AdminCatalogServlet(從管理層的預期)。然後我們轉發到jsp和我們的瀏覽器顯示給我們頁面。 (這是對數據庫的2個請求)用於用戶和項目。我認爲,就是這樣,但是...然後tomcat再次運行方法doGet()StartServlet中,將用戶從會話中轉到ValidateServlet方法Get。並重復向數據庫請求項目。

這是怎麼發生的?謝謝。

更新:如果刪除的doGet()從ValidateServletAdminCatalogServlet方法,問題消失,但後來想,當你已經登錄進入到/login時不工作

UPDATE2:我已經跟蹤了,正如評論中所建議的那樣(也許不對)。首先請求第一個請求(POST),然後是bootstrap的附加數據集。最後,/validateGET方法的第二個請求。

UPDATE2:要解決此問題,我已將StartServlet映射從/更改爲""。這意味着任何對host:port/的請求都將被重定向到這個servlet。 這個問題是由於以下事實引起的:自Bootstrap被連接以來,瀏覽器還向host:port/favicon發送了對favicon,css等的請求。由於StartServlet已映射到/,因此它收到此請求並啓動了方法GET。 欲瞭解更多信息,你可以閱讀關於DefaultServlet在Tomcat

+0

您可能想要跟蹤您實際在瀏覽器中執行的所有請求(開發工具 - >網絡,並啓用「保留日誌」複選框)。 –

+0

_「在登錄時嘗試進入/登錄時不工作」_我假設,它不起作用,因爲'StartServlet'中的此行req.getRequestDispatcher(req.getContextPath()+)/ checklogin 「).forward(req,resp);'會傳遞給'ValidateServlet.doGet' –

+0

謝謝,但我明白爲什麼它不起作用。 :)問題被問了另一個。 – AlexBal

回答

0

試圖使GET和POST在你的servlets做同樣的事情是適得其反的。不要混淆GET和POST,每個都有獨特的作用。

使用GET檢索信息,顯示頁面。GET可以書籤,瀏覽器可以緩存它們。您的AdminCatalogServlet執行查詢並將結果存儲在請求屬性中,然後轉發給JSP。它應該只使用GET。

使用POST接收客戶端發佈到服務器的表單數據。可能驗證應該與接受數據的代碼一起使用,而不是處於單獨的servlet中。

當您發佈內容時,請勿轉發到JSP。而是讓servlet重定向到get方法。重定向可讓用戶擁有有效的可收藏的網址。重定向到一個GET方法可以讓實現GET的servlet負責請求,這樣就可以一致地獲取JSP所需的數據。

如果您使用GET登錄,那麼用戶的用戶ID和密碼將位於URL中,並將由Web服務器和處理該請求的每個路由器記錄。

您也可以使用servlet過濾器將用戶發送到登錄頁面。這比使servlet執行檢查和轉發要少得多。

+0

感謝您的回答。我知道FILTERS,但想法是,已登錄並嘗試訪問登錄頁面的用戶重定向到帶有目錄的頁面。但也有2個不同的頁面與目錄:用戶和管理員。取決於角色,ValidationServlet會重定向到正確的頁面。因此,您仍然需要檢查用戶角色。 – AlexBal