2017-07-27 32 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

相关问题