2017-07-27 11 views
1

ユーザーに関する情報を検証したいと思います。ユーザーが入力して/loginページを入力しようとしている場合は、ユーザーページに転送してください。メソッドの終了後、doSostlet()はStartServletでこのメソッドを呼び出さずにメソッドdoGet()を実行します

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); 
    } 
} 
012:

この瞬間のように私は、この持っています

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> 

問題:/または/loginを呼び出すときに私たちは、StartServletから始まります。次に、ログイン、フォームにパスワード(method = POST)を入力し、ValidateServletに送信します。

AdminCatalogServlet(Adminの予定より)に転送した後。その後、jspと私たちのブラウザが私たちに表示されますページに転送します。 (データベースへの要求は2回でした)、ユーザーおよびアイテムです。私はそれだと思っていますが、それから... tomcatが再びをStartServletに入れて、セッションからユーザーを取り込み、メソッドGetにValidateServletに転送します。アイテムのデータベースへの繰り返し要求。

どうしてですか?ありがとう。

UPDATE:ValidateServletまたはAdminCatalogServletからの削除のdoGet()メソッドならば、問題は消えていますが、ログインしたとき/loginに入力しようとすると、その後は動作しません

アップデート2:私は、コメントにアドバイスされているように(たぶん正しいわけではない)、トレースしてきました。最初に最初の要求(POST)、次にブートストラップの追加データのセット。最後にGETメソッドを使用した/validateの2番目のリクエストがあります。

アップデート2:この問題を解決するために、私は/から""StartServletマッピングを変更しました。つまり、host:port/へのリクエストはこのサーブレットにリダイレクトされます。 問題は、ブートストラップが接続されているため、ブラウザがfavicon、cssなどのリクエストをhost:port/faviconに送信したためです。 StartServlet/にマップされていたため、この要求を受け取り、メソッドGETが開始されました。 詳細については、DefaultServletをTomcatで読むことができます。

+0

ブラウザで実際に実行しているすべての要求(Dev Tools - > Network、 "Preserve Log"チェックボックスを有効にする)を追跡したいと思うかもしれません。 –

+0

_ "ログインしたときに/ loginしようとすると動作しません"と仮定しています。これは 'StartServlet'' req.getRequestDispatcher(req.getContextPath()+)/ checklogin ").forward(req、resp);'あなたに 'ValidateServlet.doGet'を渡します。 –

+0

ありがとうございます。 :)質問は、他の人に尋ねられました。 – AlexBal

答えて

0

サーブレットでGETとPOSTを同じように実行しようとするのは逆効果です。 GETとPOSTを融合させないでください。それぞれ異なる役割があります。

情報の取得、ページの表示にGETを使用します。GETはブックマーク可能で、ブラウザはそれらをキャッシュできます。 AdminCatalogServletはクエリを実行し、その結果をリクエスト属性に格納してから、JSPに転送します。それはGETのみを使用する必要があります。

POSTを使用して、クライアントがサーバーに送信したフォームデータを受信します。おそらく、検証は別のサーブレットではなく、データを受け入れるコードと一緒に行うべきです。

投稿するときに、JSPに転送しないでください。代わりに、サーブレットをgetメソッドにリダイレクトさせます。リダイレクトにより、ユーザーは有効なブックマーク可能なURLを持つことができます。 GETメソッドにリダイレクトすると、GETを実装しているサーブレットはリクエストに責任を持ち、JSPで必要なデータが一貫して取得されます。

ログインにGETを使用すると、ユーザーのユーザーIDとパスワードがURLに記録され、Webサーバーと要求を処理するすべてのルーターがログに記録します。

サーブレットフィルタを使用して、ログインページにユーザーを送信することもできます。サーブレットをチェックして転送するよりも、それほど問題はありません。

+0

あなたの答えをありがとう。私はフィルターについて知っていますが、そのアイデアはすでにログインしているユーザーがログインページにアクセスしようとしていて、カタログのあるページにリダイレクトされたということでした。しかし、ディレクトリとは2つの異なるページがあります。ユーザー用と管理者用です。 ValidationServletはロールに応じて正しいページにリダイレクトされます。したがって、引き続きユーザーの役割を確認する必要があります。 – AlexBal

関連する問題