我想验证有关用户的信息。如果用户已进入并尝试进入/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