[SpringMVC] 1回の往復インターセプターで3回のインターセプト

インターセプターの役割

SpringMVCのインターセプターは、サーブレット開発のフィルターに似ており、その役割はプロセッサー処理および後処理することです

インターセプターチェーン(インターセプターチェーン)と呼ばれる、チェーンに順次接続されて定義されたインターセプター。

インターセプターのターゲットはコントローラーのビジネス方法です。これは実際にはAOPアイデアの別の実施形態です。

 

インターセプターとフィルターの違い

違い フィルタ インターセプター
使用範囲 これはサーブレット仕様の一部であり、JavaWebプロジェクトである限り使用できます。 SpringMVCフレームワークに固有です
傍受範囲 すべての動的リソース/静的リソースをインターセプトします(url-patternが/ *として構成されていると想定) jsp、js、css、imgなど(静的リソース)ではなく、コントローラーメソッド(動的リソースとして理解される)のみをインターセプトします。

 

クイックスタート

①インターセプターを作成し、HandlerInterceptorインターフェースを実装します

public class MyInterceptor1 implements HandlerInterceptor {
    
    

    // 在目标方法执行之前执行
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    
    
        System.out.println("preHandle...");
        return true;
    }

    // 在目标方法执行之后、视图返回之前执行
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    
    
        System.out.println("postHandle...");
    }

    // 视图返回之后执行
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    
    
        System.out.println("afterCompletion..");
    }
}

②インターセプターを構成します(当時、spring-mvc.xmlで構成されていました)

<!-- 配置拦截器 -->
<mvc:interceptors>
    <mvc:interceptor>
        <!-- 对哪个资源执行哪个拦截器 -->
        <mvc:mapping path="/**"/>
        <bean class="com.samarua.interceptor.MyInterceptor1" />
    </mvc:interceptor>
</mvc:interceptors>

③遮断効果をテストする

@Controller
public class TargetController {
    
    

    @RequestMapping("/target")
    public ModelAndView show() {
    
    
        System.out.println("业务逻辑正在执行>_<...");
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("name", "Alice");
        modelAndView.setViewName("hello.jsp");
        return modelAndView;
    }
}

ここに画像の説明を挿入

 
 

クイックスタートの詳細

理解して覚えておいてください:

preHandle() ターゲットメソッドが実行される前に呼び出されます。戻り値がfalseの場合、チェーンは直接切断されて終了し、通常は他のリソースに転送されます。戻り値がtrueの場合、次のインターセプターまたはコントローラーが続行します。このインターセプターのpreHandle()によるtrueの戻りは、このインターセプターのpostHandle()およびafterCompletion()の実行の前提条件であるとも言えます。(理解するには下の写真を参照してください)
postHandle() ターゲットメソッドが実行された後、ビューが戻る前に呼び出されます。このメソッドのパラメーターにはModelAndViewオブジェクトが含まれているため、ModelAndViewオブジェクトが返される前に変更できます。
完了後() ビューが戻った後に呼び出されます。すべてのプロセスが終了した後に呼び出されるとも言えます。

以下の図は、理解するのに非常に役立ちます。

ここに画像の説明を挿入

 
次のコードを読んで、インターセプターでこれら3つのメソッドの目的を体験してください。

public class MyInterceptor2 implements HandlerInterceptor {
    
    

    // 在目标方法执行之前执行
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    
    
        System.out.println("我可以决定这个拦截器链是否能继续执行...");
        String allow = request.getParameter("allow");
        if(allow.equals("yes")) {
    
    
            return true;
        } else {
    
    
            request.getRequestDispatcher("/error.jsp").forward(request, response);
            return false;
        }
    }

    // 在目标方法执行之后、视图返回之前执行
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    
    
        System.out.println("我可以偷偷修改ModelAndView对象...");
        modelAndView.addObject("username", "Hana");
    }

    // 视图返回之后执行
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    
    
        System.out.println("我几乎没什么作用...");
    }
}

 
 
 
 

 
 
 
 

 
 
 
 

もっと> _ <

おすすめ

転載: blog.csdn.net/m0_46202073/article/details/114375429