Java サーブレットを使用した標準の GAE アプリがあります。システム全体にユーザー ロール機能を実装したいと考えています。この目的のために、データベースからユーザー ロールを取得し、それをセッションに保存して、すべてのサーブレットがこのデータにアクセスできるようにします。私はそれに関するいくつかの記事を読みましたが、それを行う基本的な方法は、フィルターを使用して HttpSession に必要なデータを入力することです。ただし、この場合、すべてのサーブレットで同じ方法で HttpSession からデータを取得する必要があるため、コードが重複します。この問題の明らかな解決策は、HttpServlet クラスから派生させ、HttpSession を操作するために必要なメソッド (例: protected Role getUserRole()) を備えた独自のサーブレットを作成することです。これにより、フィルターの使用が無意味になります。この場合、フィルターを使用する理由はありますか?
2 に答える
にマップされる最上位のフィルターが必要/*
です。このフィルターは、セッションに存在しない場合、データベースからロールを取得します。HttpServletRequest
次に、ラッパー オーバーライドメソッドを拡張して作成しisUserInRole()
、そのロールが好きなようにフェッチされるようにします。このオブジェクトのオブジェクトを作成し、フィルターrequest
で使用します。chain.doFilter
したがって、すべてのサーブレットはrequest.isUserInRole()
ロールを確認するために呼び出すことができます
HttpServlet から直接継承するメイン サーブレットを使用できます。このサーブレットは、保護された Role getUserRole()を介して HttpSession からユーザー ロールを取得する方法を認識しています。アプリケーション内の他のすべてのサーブレットは、そのメイン サーブレットをサブクラス化して、共通の機能を使用できるようにする必要があります。
サーブレット フィルターは、他のサーブレットが呼び出される前に呼び出されます。フィルターの主な目的は、要求/応答を装飾してから、さらに処理するためにサーブレットに渡すことです。フィルター内からデータベースにアクセスし、それに応じて HttpSession を設定することを選択できます。これにより、各サーブレットは後で HttpSession からその情報を取得する方法を認識します。
ここでお勧めするもう 1 つのオプションは、リクエストを処理する最初のサーブレット内から HttpSession にユーザー ロールを設定することです (メイン サーブレットの別の一般的な方法でそれを行うこともできます。たとえば、protected void populateUserRole(HttpSession httpSession))。
乾杯;