我想驗證有關用戶的信息。如果用戶已進入並嘗試進入/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()從ValidateServlet
或AdminCatalogServlet
方法,問題消失,但後來想,當你已經登錄進入到/login
時不工作
UPDATE2:我已經跟蹤了,正如評論中所建議的那樣(也許不對)。首先請求第一個請求(POST
),然後是bootstrap的附加數據集。最後,/validate
有GET
方法的第二個請求。
UPDATE2:要解決此問題,我已將StartServlet
映射從/
更改爲""
。這意味着任何對host:port/
的請求都將被重定向到這個servlet。 這個問題是由於以下事實引起的:自Bootstrap被連接以來,瀏覽器還向host:port/favicon
發送了對favicon,css等的請求。由於StartServlet
已映射到/
,因此它收到此請求並啓動了方法GET
。 欲瞭解更多信息,你可以閱讀關於DefaultServlet
在Tomcat
您可能想要跟蹤您實際在瀏覽器中執行的所有請求(開發工具 - >網絡,並啓用「保留日誌」複選框)。 –
_「在登錄時嘗試進入/登錄時不工作」_我假設,它不起作用,因爲'StartServlet'中的此行req.getRequestDispatcher(req.getContextPath()+)/ checklogin 「).forward(req,resp);'會傳遞給'ValidateServlet.doGet' –
謝謝,但我明白爲什麼它不起作用。 :)問題被問了另一個。 – AlexBal