アウトライン
ここについての最初の文は、SpringMVC迎撃迎撃HandlerInterceptorです。使用SpringMVCインターセプタは、次の操作を実行する必要があります。
- インターセプタクラスを作成すると、HandlerInterceptorを実装する必要があります
- 次のようにXML構成ファイル内に配置されたインターセプターは、特定の構成のコードは次のとおり
<mvc:interceptors>
<mvc:interceptor>
<!-- /test/** 这个是拦截路径以/test开头的所有的URL-->
<mvc:mapping path="/**"/><!—这个是拦截说有的路径-->
<!-- 配置拦截器类路径-->
<bean class="cn.ljk.springmvc.controller.MyInterceptor"></bean>
<!-- 配置不拦截器URL路径-->
<mvc:exclude-mapping path="/fore/**"/>
</mvc:interceptor>
</mvc:interceptors>
SpringBootにはxmlファイルが存在しないので、そうSpringBootはインターセプタを設定するには、Javaのコンフィグ方法を提供してくれます。2つの構成があります。
- 継承WebMvcConfigurerAdapter(職員が推奨されていません)
- WebMvcConfigurerを達成
その後SpringBoot統合迎撃動作の詳細を開始!
統合された迎撃戦闘活動
最初のステップ:インターセプタクラスを宣言
それはHandlerInterceptorを実装することによって達成されます。具体的なコードは次のよう:
public class LoginInterceptor implements HandlerInterceptor{}
ステップ2:HandlerInterceptor 3つのインターセプターメソッドを実装
- preHandle:コントローラ・ロジックがインターセプトする前に実行されます
- postHandle:コントローラ・ロジックが終了されるだけでなく、前に解決するためにビューリゾルバを傍受します
- afterCompletion:コントローラロジックが終了し、インターセプトはViewRenderer
実際の開発preHandle比較的高い周波数、postHandle afterCompletionと比較的少ない操作。
プロジェクトのURLへのすべてのアクセスをブロックする次のコードpreHandle方法で定義されたレコードを記録します。正面解像度インターセプトpostHandleは、要求領域データを追加するモデルを渡します。
あなたはシーンは、以下のコメント欄にコメントすることができます使用している場合afterCompletionは一時的に、使用シナリオを期待していませんでした。
詳細インターセプタコードは次のとおりです。
public class LoginInterceptor implements HandlerInterceptor{
private Logger log = LoggerFactory.getLogger(LoginInterceptor.class);
//ControllerController逻辑执行之前
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
log.info("preHandle....");
String uri = request.getRequestURI();
log.info("uri:"+ uri);
if (handler instanceof HandlerMethod) {
HandlerMethod handlerMethod = (HandlerMethod) handler;
log.info("拦截 Controller:"+ handlerMethod.getBean().getClass().getName());
log.info("拦截方法:"+handlerMethod.getMethod().getName());
}
return true;
}
//Controller逻辑执行完毕但是视图解析器还为进行解析之前
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
log.info("postHandle....");
Map<String,Object>map=modelAndView.getModel();
map.put("msg","postHandle add msg");
}
//Controller逻辑和视图解析器执行完毕
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
log.info("afterCompletion....");
}
}
第三段階:Javaのコンフィグインターセプタを設定する方法
継承WebMvcConfigurerAdapter方法
そしてオーバーライドによってインターセプタパラメータInterceptorRegistryスプリングがコンテキストに注入れるWebMvcConfigurerAdapter addInterceptors方法が継承しました。
さらにパスをインターセプトし、InterceptorRegistry addPathPatternsとexcludePathPatterns方法によって設定されたパスをインターセプトしません。
公式には@Deprecated WebMvcConfigurerAdapterとしてマークされているので、このように当局者は、推奨されていません。
@Deprecated
public abstract class WebMvcConfigurerAdapter implements WebMvcConfigurer {
詳細な後継WebMvcConfigurerAdapterコードは次のとおりです。
@Configuration
public class InterceptorConfigByExtendsWebMvcConfigurerAdapter extends WebMvcConfigurerAdapter{
@Bean
public LoginInterceptor loginInterceptor(){
return new LoginInterceptor();
}
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginInterceptor()).addPathPatterns("/**").excludePathPatterns("/*.html");
}
}
WebMvcConfigurerを達成する方法
インタフェースを実装し、他の操作などaddInterceptorsの方法と継承WebMvcConfigurerAdapterの方法を達成することによりWebMvcConfigurer。具体的なコードは次のよう:
```java
@Configuration
public class InterceptorConfigByImplWebMvcConfigurer implements WebMvcConfigurer{
@Bean
public LoginInterceptor loginInterceptor(){
return new LoginInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginInterceptor()).addPathPatterns("/**").excludePathPatterns("/*.html");
}
}
```
テスト
次のように一般的なコントローラ、特定のコードを書きます:
@Controller
public class IndexController {
@GetMapping("/index")
public String index(ModelAndView modelAndView){
return "index";
}
}
SRC /メイン/リソース、次のコードの下のtemplatesディレクトリにあるIndexControllerアクセスページindex.ftlの作成:
<h1>${msg}</h1>
私はここで使用されているので、ページが次のように特定のポイントに依存Freemarkerのスターターを導入する必要があると言うために使用されるときFreemarkerのです。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
次のように具体的な効果にアクセスするには、8080 / SBE /インデックス:ローカルホストにアクセスすることによりツアー:
ドメイン要求MSGにデータを追加することにより、図モデル時代に示されているように、正常に表示の正面を解決!
次のようにログ出力情報は、次のとおりです。コントローラーインターセプト傍受アドレスとログ出力との具体的な方法
2019-09-24 15:53:04.144 INFO 7732 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/sbe] : Initializing Spring DispatcherServlet 'dispatcherServlet'
2019-09-24 15:53:04.145 INFO 7732 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2019-09-24 15:53:04.153 INFO 7732 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 8 ms
2019-09-24 15:53:04.155 INFO 7732 --- [nio-8080-exec-1] c.lijunkui.interceptor.LoginInterceptor : preHandle....
2019-09-24 15:53:04.155 INFO 7732 --- [nio-8080-exec-1] c.lijunkui.interceptor.LoginInterceptor : uri:/sbe/index
2019-09-24 15:53:04.155 INFO 7732 --- [nio-8080-exec-1] c.lijunkui.interceptor.LoginInterceptor : 拦截 Controller:cn.lijunkui.controller.IndexController
2019-09-24 15:53:04.155 INFO 7732 --- [nio-8080-exec-1] c.lijunkui.interceptor.LoginInterceptor : 拦截方法:index
2019-09-24 15:53:04.156 INFO 7732 --- [nio-8080-exec-1] c.lijunkui.interceptor.LoginInterceptor : postHandle....
2019-09-24 15:53:04.161 INFO 7732 --- [nio-8080-exec-1] c.lijunkui.interceptor.LoginInterceptor : afterCompletion....
概要
フィルタと統合等SpringBoot 2積分動作インターセプタは、春のコンテキスト内に注入されたクラスが登録したが、FilterRegistrationBeanフィルタを使用してインターセプタはInterceptorRegistryに使用されます。
個人的に私は簡単にXML設定を使用するよりもそのように感じ、そしてあなたがSpringBootインターセプタープロジェクトで使用されていない場合は、それについて動作するように速攻を作ります!
サンプルコード
春ブート-2.xの-迎撃プロジェクトビューと呼ばれるモジュールの私のGitHubリポジトリspringbootexamplesにおける具体的なコード例
GitHubのします。https://github.com/zhuoqianmingyue/springbootexamples