【SpringMVC学習11】SpringMVCのインターセプタ
Springmvcのプロセッサブロッカーは、サーブレット開発中のフィルタFilterと同様に、プロセッサの前処理と後処理に使用されます.本文は主にspringmvcにおけるブロッカーがどのように定義されているか、およびブロッカーの実行状況と使用方法をテストするかをまとめた.
1.springmvcブロッカーの定義と構成
1.1 springmvcブロッキングの定義
Springmvcでは、HandlerInterceptorインタフェースを実装するブロッカーを定義し、次の3つの方法でインタフェースを実装します.
この3つの方法について、簡単な分析をします. preHandleメソッド:Handlerメソッドに入る前に実行します.アイデンティティ認証、アイデンティティ認証に使用できます.例えば、認証が通過していない場合、ユーザがログインしていないことを示すために、この方法は、次のステップを実行しないことをブロックする必要があります.そうしないと、ローにします. postHandleメソッド:Handlerメソッドに入った後、ModelAndViewに戻る前に実行します.この方法にはmodelAndViewのパラメータが見られる.適用シーン:modelAndViewから:メニューナビゲーションなどの共通のモデルデータをここでビューに渡すか、ここで同じビューを指定できます. afterCompletionメソッド:Handlerが完了した後に実行します.適用シーン:統合例外処理、統合ログ処理など.
1.2 springmvcブロッキングの構成
springmvcでは、ブロッキングは、特定のHandlerMappingに対して構成される.すなわち、あるHandlerMappingでブロッキングが構成されると、HandlerMappingに成功したhandlerが最終的にブロッキングを使用する.例えば、プロファイルで構成するマッパーがorgであるとする.springframework.web.servlet.handler.BeanNameUrlHandlerMappingでは、ブロッキングを構成できます.
ではspringmvcでは、グローバルに似たブロッキングをどのように構成しますか?前述したように、springmvc内のブロッキングは特定のマッパーに対して行われており、この問題を解決するためにspringmvcフレームワークは、構成されたグローバル類似のブロッキングを各HandlerMappingに注入することで、グローバルなブロッキングとなる.次のように構成されています.
一般的には、この構成を使用して、
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メソッド
3.2ログイン検証ブロッカーの実装
次に、ブロッキングを構成します.
これによりurlを任意に要求すると、定義したばかりのブロッカーにキャプチャされ、セッションにユーザー情報があるかどうかを判断し、なければログインページにジャンプしてログインします.
ブロッキングの使用は基本的にここまでまとめられています.
関連情報:http://blog.csdn.net/column/details/spring-mvc.html学習ノートのソースコードのダウンロードアドレス:https://github.com/eson15/SpringMVC_Study
-分かち合い、共に進歩する!-私のブログのホームページ:http://blog.csdn.net/eson_15
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つの方法について、簡単な分析をします.
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