インターセプタ紹介
春のWeb MVCは、フィルターフィルターサーブレット開発、前処理および後処理のためのプロセッサに類似のプロセッサを、インターセプタ。
一般的なシナリオ
-
ログ:ログは、情報、監視のための情報、統計情報を計算PV(ページビュー)を要求します
-
パーミッションチェック:ログインページへの直接のリターンがない場合、ログインの検出など、検出がプロセッサにログインされていることを検出
-
性能監視:何とか遅い開始時刻が要求することにより、処理時間、処理の終了後、前インターセプタを介してプロセッサに入る記録時間を記録することができる時々一定期間
-
一般的な動作:クッキーがあれば、複数のプロセッサが、インターセプタを使用して達成するために必要とされる情報を読み、それ以降の処理を容易にするために使用する、ユーザ要求にユーザーオブジェクトを与えるため、ならびにロケール、テーマ情報抽出、等
最初のSpring MVCのインターセプタ
Spring MVCのインターセプタを実装する必要がある HandlerInterceptor
インターフェイスを、インターフェイスはそれぞれ、3つのメソッドを定義し preHandle()
、postHandle()
そして afterCompletion()
私たちのプロセスは、これらの3つのメソッドを書き換えることにより、ユーザの要求を傍受することです。
-
preHandle(HttpServletRequest request, HttpServletResponse response, Object handle)
この方法は、先行リクエストの処理が呼び出されます。スプリングMVCザインターセプタと呼ばれる鎖であり、または1つのアプリケーションにある間に複数の要求インターセプタがあるかもしれないこと。各呼び出しは、その宣言の順序に従ってインターセプタの実装が続く、とにインターセプタを実行するために最初にされていることになるpreHandle
方法、あなたがすることもでき、いくつかの事前初期化を実行するか、この方法では、現在の前処理のための要求を行うことが可能ですこの方法では、いくつかの判断は、要求を継続すべきかどうかを判断します。戻り値は、それが返されたときに、ブール型のブール値であるfalse
場合、戻り値;、それは要求の終わりがないことを示し、そして後続のインターセプタコントローラがもはや実行されますtrue
、次のインターセプタコールし続けるpreHandle
方法を、場合にインタセプタがすでに最後の時間で、それはコントローラの現在のリクエストのメソッドが呼び出されます。 -
postHandle(HttpServletRequest request, HttpServletResponse response, Object handle, ModelAndView modelAndView)
:preHandle
私たちはこの方法を知っているの解釈方法はに言うために戻っ含めるafterCompletion
唯一の方法すべてのインターセプタが現在属しpreHandle
メソッドの戻り値true
の順序が呼び出されます。postHandle
この方法は、それが現在のリクエストが処理されますが、それはなります後にコントローラを実行するためのメソッド呼び出しの後に、あるDispatcherServlet
ビューが復帰レンダリングされる前に呼び出されるので、我々はこの方法では、コントローラの後に対処することができModelAndView
、操作対象。postHandle
この方法は、方向と呼ばれpreHandle
、反対、すなわち、インターセプタは最初の文ですpostHandle
方法が、会議の後に実行します。 -
afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handle, Exception ex)
:また、現在、対応するインターセプターのニーズがあるpreHandle
メソッドの戻り値がtrue
ときに実行されます。したがって、方法は、全体の要求の終了後にDispatcherServlet
対応するビューをレンダリングした後に実行される、この方法の主な役割は、リソースのクリーンアップのために働くことです。
ログインインターセプターを作成します。
2人の裁判官を傍受するためにログイン
- 加えて、ログインインタフェースにアクセスすると、ログインしていない場合、ログインは、ログインにジャンプするかどうかを判断します
- あなたはログインしている場合、着陸するかどうかを判断するためにログインインターフェイスにアクセスする場合は、ホームページにジャンプ
ステップ:
- セッションへのログインに成功した後、ユーザー情報
- LoginInterceptorが機能1を実現作成
- ToLoginInterceptorは、機能を実現するの作成2
- バネmvc.xmlに配置されたインターセプター
コード:
ログインに成功した後、
//把登录信息放入session
req.getSession().setAttribute("user",user);
LoginInterceptor
package com.example.my.shop.web.Interceptor;
import com.example.my.shop.entity.User;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 登录拦截器
*
*/
public class LoginInterceptor implements HandlerInterceptor{
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
User user =(User) httpServletRequest.getSession().getAttribute("user");
//用户未登录,重定向到登录页
if(user==null){
httpServletResponse.sendRedirect("/login");
return false;
}
//放行
return true;
}
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
}
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
}
}
ToLoginInterceptor
package com.example.my.shop.web.Interceptor;
import com.example.my.shop.entity.User;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ToLoginInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
return true;
}
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
//如果请求来自登录页
if(modelAndView.getViewName().endsWith("login")){
User user=(User)httpServletRequest.getSession().getAttribute("user");
if(user!=null){
httpServletResponse.sendRedirect("/main");
}
}
}
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
}
}
春-mvc.xml
<!-- 拦截器配置,拦截顺序:先执行后定义的,排在第一位的最后执行。对除了static和/login之外的请求进行拦截,如果未登录,跳转登陆界面-->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/static/**"/>
<mvc:exclude-mapping path="/login"/>
<bean class="com.example.my.shop.web.Interceptor.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
<!-- 拦截器配置 对所有请求进行拦截-->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.example.my.shop.web.Interceptor.ToLoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
これまでのところ、コード:https://download.csdn.net/download/shmily_syw/11242393
エディタ: