インターセプターの役割
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("我几乎没什么作用...");
}
}