【SpringMVC学習11】SpringMVCのインターセプタ


Springmvcのプロセッサブロッカーは、サーブレット開発中のフィルタFilterと同様に、プロセッサの前処理と後処理に使用されます.本文は主にspringmvcにおけるブロッカーがどのように定義されているか、およびブロッカーの実行状況と使用方法をテストするかをまとめた.
1.springmvcブロッカーの定義と構成
1.1 springmvcブロッキングの定義
Springmvcでは、HandlerInterceptorインタフェースを実装するブロッカーを定義し、次の3つの方法でインタフェースを実装します.
//     1
public class HandlerInterceptor1 implements HandlerInterceptor{

    @Override
    public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {

        System.out.println("HandlerInterceptor1....preHandle");

        //false    ,     ;true    
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {

        System.out.println("HandlerInterceptor1....postHandle");

    }

    @Override
    public void afterCompletion(HttpServletRequest request,
            HttpServletResponse response, Object handler, Exception ex)
            throws Exception {

        System.out.println("HandlerInterceptor1....afterCompletion");
    }
}

この3つの方法について、簡単な分析をします.
  • preHandleメソッド:Handlerメソッドに入る前に実行します.アイデンティティ認証、アイデンティティ認証に使用できます.例えば、認証が通過していない場合、ユーザがログインしていないことを示すために、この方法は、次のステップを実行しないことをブロックする必要があります.そうしないと、ローにします.
  • postHandleメソッド:Handlerメソッドに入った後、ModelAndViewに戻る前に実行します.この方法にはmodelAndViewのパラメータが見られる.適用シーン:modelAndViewから:メニューナビゲーションなどの共通のモデルデータをここでビューに渡すか、ここで同じビューを指定できます.
  • afterCompletionメソッド:Handlerが完了した後に実行します.適用シーン:統合例外処理、統合ログ処理など.

  • 1.2 springmvcブロッキングの構成
    springmvcでは、ブロッキングは、特定のHandlerMappingに対して構成される.すなわち、あるHandlerMappingでブロッキングが構成されると、HandlerMappingに成功したhandlerが最終的にブロッキングを使用する.例えば、プロファイルで構成するマッパーがorgであるとする.springframework.web.servlet.handler.BeanNameUrlHandlerMappingでは、ブロッキングを構成できます.
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
        <property name="interceptors">
            <list>
                <ref bean="handlerInterceptor1"/>
                <ref bean="handlerInterceptor2"/>
            </list>
        </property>
    </bean>
    <bean id="handlerInterceptor1" class="ssm.intercapter.HandlerInterceptor1"/>
    <bean id="handlerInterceptor2" class="ssm.intercapter.HandlerInterceptor2"/>

    ではspringmvcでは、グローバルに似たブロッキングをどのように構成しますか?前述したように、springmvc内のブロッキングは特定のマッパーに対して行われており、この問題を解決するためにspringmvcフレームワークは、構成されたグローバル類似のブロッキングを各HandlerMappingに注入することで、グローバルなブロッキングとなる.次のように構成されています.
    <!--       -->
    <mvc:interceptors>
        <!--      ,      -->        
        <mvc:interceptor>
            <mvc:mapping path="/**"/> <!--        url   url   -->
            <bean class="ssm.interceptor.HandlerInterceptor1"/>
        </mvc:interceptor>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="ssm.interceptor.HandlerInterceptor2"/>
        </mvc:interceptor>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="ssm.interceptor.HandlerInterceptor3"/>
        </mvc:interceptor>
    </mvc:interceptors>

    一般的には、この構成を使用して、<mvc:mapping>でブロックするurlを指定すればいいです.
    2.springmvcブロッキングの実行テスト
    上のHandlerInterceptor 1に倣って2つのブロック、HandlerInterceptor 2とHandlerInterceptor 3を書き、上記の構成に従います.次に,3つのブロッキングの実行状況をテストし,関連するまとめを行った.
    2.1 3つのブロッキングをすべて実行
    すなわち、3つのブロッキングのpreHandleメソッドの戻り値をtrueに変更して、ブロッキングの実行順序をテストします.テスト結果は次のとおりです.
    HandlerInterceptor1….preHandle HandlerInterceptor2….preHandle HandlerInterceptor3….preHandle
    HandlerInterceptor3….postHandle HandlerInterceptor2….postHandle HandlerInterceptor1….postHandle
    HandlerInterceptor3….afterCompletion HandlerInterceptor2….afterCompletion HandlerInterceptor1….afterCompletion
    印刷結果に基づいてまとめます.すべてのブロッカーが放行されると、preHandleメソッドは構成の順序で実行されます.他の2つの方法は、構成の順序で逆方向に実行されます.
    2.2遮断器が1つあって放さない
    3番目のブロッキングのpreHandleメソッドの戻り値をfalseに変更し、最初の2つはtrueで、ブロッキングの実行順序をテストします.テスト結果は次のとおりです.
    HandlerInterceptor1….preHandle HandlerInterceptor2….preHandle HandlerInterceptor3….preHandle
    HandlerInterceptor2….afterCompletion HandlerInterceptor1….afterCompletion
    印刷結果に基づいてまとめます:1.ブロッキング1と2が放行されるため、ブロッキング3のpreHandleが実行される.つまり、前のブロッキングが放行され、後のブロッキングがpreHandleを実行することができます.  2. ブロッキング3は、開放されないので、他の2つの方法は実行されない.すなわち、ブロッキングが実行されない場合、他の2つの方法はバックグラウンドで実行されません.  3. 1つのブロッキングが実行されない限り、すべてのブロッキングのpostHandleメソッドは実行されませんが、preHandleが実行され、実行された場合、afterCompletionメソッドが実行されます.
    2.3 3つの遮断器はすべて放さない
    この場合は上記の状況を参考にすることができます.特例です.運行結果も見てみましょう.
    HandlerInterceptor1….preHandle
    明らかに、最初のブロッキングのpreHandleメソッドのみが実行され、いずれも実行されないため、postHandleメソッドとafterCompletionメソッドは実行されません.
    3.遮断器の使用
    2つ目のケースから見ると、例えば現在、統一異常処理の論理を書く場合、ブロックをブロックチェーンの最初の位置に配置し、必ず放行しなければならない.放行してこそafterCompletionが実行され、ブロックチェーンの1つ目に置くとafterCompletionメソッドが最後に実行されるため、統一異常処理の論理を実行することができます.例えば、認証ブロッカーにログインし、ブロッカーリンクの最初の位置に置く(統一異常処理があれば、統一異常処理の後ろに置くべき).パーミッションチェックブロッカーは、認証ブロッカーにログインした後(ログインが通過した後にパーミッションをチェックするため)に置かれます.ここではspringmvcのブロッキングの使用方法を説明するために、ログイン検証のブロッキングを書きます.
    3.1需要
    まず需要を見てみましょう.私たちは何を止めなければなりませんか.何をしますか.考え方は以下の通りである.
    1.ユーザはurl 2を要求し、ブロックはブロックチェックを行い、要求したurlが公開アドレス(ログインせずにアクセスできるurl)であれば、放行させる.ユーザーセッションが存在しない場合は、ログインページにジャンプします.ユーザーセッションが存在する場合はローにし、操作を続行します.
    3.2ログインを実現するControllerメソッド
    //  
    @RequestMapping("/login")
    public String login(HttpServletRequest request, String username, String password) throws Exception {
    
        //            
        //....
        //          
        HttpSession session = request.getSession();
        session.setAttribute("username", username);
        return "redirect:queryItems.action";
    }
    
    //  
    @RequestMapping("/logout")
    public String logout(HttpServletRequest request) throws Exception {
    
        HttpSession session = request.getSession();
        session.invalidate();
        return "redirect:queryItems.action";
    }

    3.2ログイン検証ブロッカーの実装
    //     1
    public class LoginInterceptor implements HandlerInterceptor{
    
        //  Handler      
        //        、    。                ,             ,     
        @Override
        public boolean preHandle(HttpServletRequest request,
                HttpServletResponse response, Object handler) throws Exception {
    
            //     url
            String url = request.getRequestURI();
            //  url      (                  )
            //                 
            if(url.indexOf("login.action") > 0) {
                //        ,  
                return true;
            }
    
            //  session
            HttpSession session = request.getSession();
            // session         
            String username = (String) session.getAttribute("username");
            if(username != null) {
                return true;
            }
    
            //               ,       
            request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);
    
            return false;
        }
        //    ,           ,     
    }

    次に、ブロッキングを構成します.
    <!--       -->
    <mvc:interceptors>
        <!--      ,      -->    
        <mvc:interceptor>
            <mvc:mapping path="/**"/> <!--      url   url   -->
            <bean class="ssm.interceptor.LoginInterceptor"/>
        </mvc:interceptor>
        <!--       -->
    </mvc:interceptors>

    これによりurlを任意に要求すると、定義したばかりのブロッカーにキャプチャされ、セッションにユーザー情報があるかどうかを判断し、なければログインページにジャンプしてログインします.
    <form action="${pageContext.request.contextPath }/login.action" method="post"><input type="text" name="username" /><br><input type="password" name="password" /><br>
        <input type="submit" name="  " />
    </form>

    ブロッキングの使用は基本的にここまでまとめられています.  
    関連情報:http://blog.csdn.net/column/details/spring-mvc.html学習ノートのソースコードのダウンロードアドレス:https://github.com/eson15/SpringMVC_Study
    -分かち合い、共に進歩する!-私のブログのホームページ:http://blog.csdn.net/eson_15