Maison  >  Article  >  Java  >  Explication détaillée d'exemples d'intercepteurs en Java

Explication détaillée d'exemples d'intercepteurs en Java

Y2J
Y2Joriginal
2017-05-10 10:32:582732parcourir

Cet article présente principalement l'exemple de code d'utilisation simple de l'intercepteur Spring Boot. Les amis qui en ont besoin peuvent s'y référer

1 L'intercepteur Spring Boot par défaut est : <.>

HandlerInterceptorAdapter

AbstractHandlerMapping
UserRoleAuthorizationInterceptor
LocaleChangeInterceptor
ThemeChangeInterceptor

LocaleChangeInterceptor et ThemeChangeInterceptor sont plus couramment utilisés.

2. L'implémentation d'un intercepteur personnalisé ne nécessite que 3 étapes :

1), créer notre propre classe d'intercepteur et implémenter HandlerInterceptor

Interface .

2), créez une classe Java

héritez de WebMvcConfigurerAdapter et remplacez la méthode addInterceptors.

3), instanciez notre intercepteur personnalisé, puis ajoutez manuellement l'objet à la chaîne d'intercepteurs (ajoutée dans la méthode addInterceptors).

3. Exemple de code

Code de classe IndexInterceptor.java :

package com.example.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class IndexInterceptor implements HandlerInterceptor{
  @Override
  public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
      throws Exception {
    System.out.println(">>>IndexInterceptor>>>>>>>在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)");
  }
  @Override
  public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
      throws Exception {
    System.out.println(">>>IndexInterceptor>>>>>>>请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)");
  }
  @Override
  public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
     System.out.println(">>>IndexInterceptor>>>>>>>在请求处理之前进行调用(Controller方法调用之前)");
     // 只有返回true才会继续向下执行,返回false取消当前请求
     return true;
  }
}
Code de classe IndexInterceptor2.java :

package com.example.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class IndexInterceptor2 implements HandlerInterceptor{
  @Override
  public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
      throws Exception {
    System.out.println(">>>IndexInterceptor2>>>>>>>在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)");
  }
  @Override
  public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
      throws Exception {
    System.out.println(">>>IndexInterceptor2>>>>>>>请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)");
  }
  @Override
  public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
     System.out.println(">>>IndexInterceptor2>>>>>>>在请求处理之前进行调用(Controller方法调用之前)");
     // 只有返回true才会继续向下执行,返回false取消当前请求
     return false;
  }
}
Code de classe SimpleWebAppConfigurer.java :

package com.example.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import com.example.interceptor.IndexInterceptor;
import com.example.interceptor.IndexInterceptor2;
//只要能被springboot扫描到即可
@Configuration
public class SimpleWebAppConfigurer extends WebMvcConfigurerAdapter{
  @Override
  public void addInterceptors(InterceptorRegistry registry) {
    // 多个拦截器组成一个拦截器链
    // addPathPatterns 用于添加拦截规则
    // excludePathPatterns 用户排除拦截
    registry.addInterceptor(new IndexInterceptor()).addPathPatterns("/**");
    registry.addInterceptor(new IndexInterceptor2()).addPathPatterns("/**");
    super.addInterceptors(registry);
  }
}

4. Instructions d'analyse de l'intercepteur

preHandle** : Méthode de rappel de prétraitement pour implémenter le prétraitement du processeur (comme la vérification de connexion). Le troisième paramètre est le processeur de réponse (comme notre implémentation de contrôleur dans le chapitre précédent

Valeur de retour : true signifie continuer le processus (comme l'appel) ; le prochain intercepteur ou processeur);

false indique que le processus est interrompu (comme un échec de vérification de connexion) et ne continuera pas à appeler d'autres intercepteurs ou processeurs. À ce stade, nous devons le générer via la réponse. ;

postHandle** : méthode de rappel de post-traitement pour implémenter le post-traitement du processeur (mais avant de rendre la vue), à ​​ce moment nous pouvons passer modelAndView (

Model et View Object ) traite les données ou les vues du modèle. modelAndView peut également être null.

afterCompletion** : méthode de rappel après le traitement de l'intégralité de la requête, c'est-à-dire rappelée lorsque la vue est rendue. Par exemple, dans la surveillance des performances, nous pouvons enregistrer l'heure de fin et afficher ici le temps de consommation, et peut également effectuer un nettoyage des ressources, similaire à finalement dans try-catch-finally, mais appelle uniquement afterCompletion** de l'intercepteur dont preHandle renvoie true dans la chaîne d'exécution du processeur.

[Recommandations associées]

1.

Tutoriels vidéo gratuits Java

2.

Analyse complète des annotations Java.

3.

Manuel du didacticiel FastJson

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn