SpringMVCでインターセプタインターセプタは非常に重要と非常に便利である。その主な機能は、指定したユーザーの要求を傍受することであると、対応する前処理と後処理を行うこと。インターセプターはグローバルであり、複数のコントローラーをインターセプトできます。プロジェクトには0個以上のインターセプターが存在する可能性があり、それらはユーザー要求を一緒にインターセプトします。インターセプターは、ユーザーログイン処理、権限チェック、およびロギングで一般的に使用されます。
1.インターセプターの実行
実装手順:
1.Controllerクラスを作成します
2.共通のクラスを作成します
1)HandleInterceptorインターフェースを実装する
2)インターフェースに3つのメソッドを実装します
3.ショーページを作成します
4.Springmvc構成ファイルを作成します
1)コンポーネントスキャナー、@ Controllerアノテーションをスキャン
2)インターセプターを宣言し、インターセプトされたリクエストURIアドレスを指定します
HandleInterceptorインターフェースを実装するための共通クラスを作成する場合、3つのメソッドが詳細に説明されています。
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("拦截器方法preHandle()执行");
return true;
}
preHandle: 前処理方法
パラメータ:
オブジェクトハンドラー:インターセプトされたコントローラーオブジェクトmyController
戻り値はブール値です。
1. true:リクエストはインターセプターの検証に合格し、プロセッサーメソッドを実行できます
2. False:リクエストはインターセプターの検証に合格せず、プロセッサーメソッドを実行できません
特徴:
1.コントローラーメソッド(myControllerメソッド)が実行される前に実行されるユーザーの要求は、最初にこのメソッドに到達します
2.この方法では、あなたは要求された情報を得ることができ、要求が要件を満たしているかどうかを検証、ユーザーがログインしているかどうかを確認し、ユーザーが特定のリンクアドレス(URL)にアクセスする権限を持っているかどうかを確認します 。
検証が失敗した場合、要求は切り捨てられ、要求を処理できなくなります。
検証が成功すると、リクエストを解放して、コントローラーメソッドを実行できます。
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
time = System.currentTimeMillis();
if(modelAndView !=null){
modelAndView.addObject("mydate",new Date());
modelAndView.setViewName("other");
}
System.out.println("拦截器方法postHandle()执行");
}
postHandle:後処理メソッド
パラメータ:
オブジェクトハンドラー: インターセプトされた処理オブジェクトmyController
ModelAndView: modelAndView:プロセッサメソッドの戻り値
特徴:
1.プロセッサメソッド(myController.dosome())の後に実行されます
図2に示すように、プロセッサは、戻り値のModelAndViewを取得してもよい、ことができるデータとビューのModelAndViewを変更し、最終的な実行結果に影響を与えることができます。
3.その主な機能:元の実行結果に対して2番目の修正を実行することです
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("postHandle到afterCompletion方法的执行时间:"+(System.currentTimeMillis()-time));
System.out.println("拦截器的afterCompletion()执行了");
}
afterCompletion:最後に実行されたメソッド
パラメータ:
オブジェクトハンドラー:インターセプトされたコントローラーオブジェクトmyController
例外例:プログラムで発生した例外
特徴:
1.リクエスト処理が完了した後に実行されるフレームワークは、ビュー処理が完了すると、ビューでフォワードを実行した後にリクエスト処理が完了したと見なされることを規定しています。
2.通常、リソース回復の作業を行います。一部のオブジェクトはプログラム要求の過程で作成され、ここで削除してリサイクルできます。
Springmvc構成ファイルを作成します。
インターセプターを宣言する:0個以上のインターセプターが存在する可能性があります
最初のステートメントインターセプターインターセプターインターセプターは
マッピングパス= "" 傍受されたリクエストのURLアドレスを指定します
パス:URIアドレスであり、ワイルドカードを使用できます **
**:ディレクトリ/ user /内の任意の文字、ファイル、またはマルチレベルのディレクトリとファイルを 表します**:これはuserで始まる場合に傍受されます
/ user:前の/はルートディレクトリです
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<context:component-scan base-package="cn.com.Ycy.Contrller"/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前缀名:视图文件的路径-->
<property name="prefix" value="/WEB-INF/"/>
<!-- 后缀名:视图文件的扩展名 -->
<property name="suffix" value=".jsp"/>
</bean>
<!-- 声明拦截器:拦截器可以有0个或者多个 -->
<mvc:interceptors>
<!-- 声明第一个拦截器 一个interceptor就是一个拦截器 -->
<mvc:interceptor>
<mvc:mapping path="/user/**"/>
<bean class="cn.com.Ycy.handler.myInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
</beans>
コードデモ:
ページ:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<meta http-equiv="Content-Type" content="textml; charset=UTF-8">
<title>Title</title>
</head>
<body>
<p>一个拦截器</p>
<form action="user/some.do" method="post">
姓名:<input type="text" name="name"><br/>
年龄:<input type="text" name="age"><br/>
<input type="submit" value="提交请求">
</form>
</body>
</html>
コントローラークラス:
@RequestMapping(value = "/user")
@Controller
public class myController {
@RequestMapping(value = "/some.do")
public ModelAndView dosome(String name,String age) {
System.out.println("dosome方法执行");
ModelAndView mv = new ModelAndView();
mv.addObject("myname",name);
mv.addObject("myage",age);
mv.setViewName("show");
return mv;
}
}
インターセプタークラス :
public class myInterceptor implements HandlerInterceptor {
private long time;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("拦截器方法preHandle()执行");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
time = System.currentTimeMillis();
if(modelAndView !=null){
modelAndView.addObject("mydate",new Date());
modelAndView.setViewName("other");
}
System.out.println("拦截器方法postHandle()执行");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("postHandle到afterCompletion方法的执行时间:"+(System.currentTimeMillis()-time));
System.out.println("拦截器的afterCompletion()执行了");
}
}
インターセプターでのメソッドとプロセッサーメソッドの実行シーケンスは次のとおりです。
2.複数のインターセプターの実行
場合、複数のインターセプタがあり、インターセプタチェーンが形成されています。インターセプターチェーンの実行順序は、その登録順序と一致しています。特定のインターセプターのpreHandle()メソッドがtrueを返し、実行されると、インターセプターのafterCompletion()メソッドが特別なメソッドスタックに配置されることを再度強調する必要があります。
複数のインターセプターの登録と実行:
出力結果:
複数のインターセプターでのメソッドとプロセッサーメソッドの実行シーケンスは次のとおりです。