当前位置:网站首页>L'intercepteur handlerinterceptor personnalisé permet l'authentification de l'utilisateur
L'intercepteur handlerinterceptor personnalisé permet l'authentification de l'utilisateur
2022-06-29 17:21:00 【Un cochon qui embrasse le chou】
Les utilisations courantes des intercepteurs sont:
1、Logging:Enregistrement des informations demandées,Pour la surveillance de l'information、Statistiques de l'information、CalculPV(Page View)Attendez..
2、Vérification des droits:Comme la détection de connexion,Entrez le processeur pour détecter si vous êtes connecté,Si vous ne retournez pas directement à la page de connexion;
3、Surveillance du rendement:Parfois, le système est incroyablement lent à un moment donné,L'heure de début peut être enregistrée par l'intercepteur avant d'entrer dans le processeur,Enregistrer l'heure de fin après le traitement,Pour obtenir le temps de traitement de la demande(S'il y a un agent inverse,Par exemple:apachePeut enregistrer automatiquement);
4、Comportement général:LirecookieObtenir des informations sur l'utilisateur et placer l'objet utilisateur dans la demande,Pour faciliter l'utilisation des processus ultérieurs,Et comme extraireLocale、ThemeInformation, etc,L'implémentation avec intercepteur est disponible tant que plusieurs processeurs sont nécessaires.
5、OpenSessionInView:Par exemple:Hibernate,Lors de l'ouverture du processeur d'entréeSession,Fermer une fois terminéSession.
…………L'essence aussi.AOP(Programmation orientée tangente),C'est - à - dire que toutes les fonctions qui correspondent aux préoccupations transversales peuvent être mises en œuvre dans l'intercepteur.
L'intercepteur réalise le principe d'authentification de l'utilisateur:
- Créer des annotations personnalisées pour les classes et les méthodes,Utilisé pour déterminer si l'accès à cette méthode nécessite une authentification
- Intercepteur personnalisé,Si les demandes interceptées doivent être authentifiées,Si l'authentification passe.
- Enregistrer un intercepteur personnalisé
Voici commentHandlerInterceptorExemple d'intercepteur
1、Commentaires personnalisés
/**
* Commentaires personnalisés, Utilisé pour indiquer si la classe active de la méthode doit être authentifiée
*/
@Target({ElementType.METHOD, ElementType.TYPE}) //Spécifiez où utiliser l'annotation
@Retention(RetentionPolicy.RUNTIME) //Préciser la portée de l'annotation,Exécution du Code
public @interface UserLoginToken {
boolean required() default true; //Par défautTRUE
}2、Intercepteur personnalisé,RéalisationHandlerInterceptorInterface
public class AuthenticationInterceptor implements HandlerInterceptor {
/**
* Cette méthode sera appelée avant le traitement de la demande, Utilisé pour renforcer les droits des utilisateurs
*/
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object object) throws Exception {
String token = httpServletRequest.getHeader("token");// De http Retirer de l'en - tête de la demande token
// Si elle n'est pas cartographiée à la méthode directement à travers
if(!(object instanceof HandlerMethod)){
return true;
}
//Méthode d'obtention de la demande
HandlerMethod handlerMethod=(HandlerMethod)object;
Method method=handlerMethod.getMethod();
//Vérifiez s'il y apasstokenNotes,Oui, sauter l'authentification
if (method.isAnnotationPresent(PassToken.class)) {
PassToken passToken = method.getAnnotation(PassToken.class);
if (passToken.required()) {
return true;
}
}
//Vérifier les annotations qui nécessitent des permissions d'utilisateur
if (method.isAnnotationPresent(UserLoginToken.class)) {
UserLoginToken userLoginToken = method.getAnnotation(UserLoginToken.class);
if (userLoginToken.required()) {
// Effectuer la certification
if (token == null) {
log.error("Aucunetoken,Veuillez vous connecter à nouveau");
throw new RuntimeException("Aucunetoken,Veuillez vous connecter à nouveau");
}
// Accès token Dans user id
String userId;
try {
DecodedJWT decode = JWT.decode(token);
userId = decode.getAudience().get(0);
Date expiresAt = decode.getExpiresAt();//AccèstokenDate d'expiration
if (expiresAt.before(new Date())) {
log.error("tokenExpiré,Veuillez vous connecter à nouveau");
throw new RuntimeException("tokenExpiré,Veuillez vous connecter à nouveau");
}
} catch (Exception j) {
log.error("Aucunetoken,Veuillez vous connecter à nouveau");
throw new RuntimeException("Aucunetoken,Veuillez vous connecter à nouveau");
}
//SelontokenParsed inuserIDDéterminer si l'utilisateur existe
// ExTraderUser user = exTraderUserMapper.selectByCode(userId);
// ExUser exUserV2 = exUserMapper.selectByCode(userId);
// if (user == null && exUserV2 == null) {
// log.error("L'utilisateur n'existe pas,Veuillez vous connecter à nouveau");
// throw new RuntimeException("L'utilisateur n'existe pas,Veuillez vous connecter à nouveau");
// }
// if(Objects.isNull(user) && Objects.isNull(user.getTRADE_CENTER_NAME()) &&Objects.isNull(exUserV2) && Objects.isNull(exUserV2.getTRADE_CENTER_NAME())){
// log.error("L'utilisateur n'existe pas,Veuillez vous connecter à nouveau");
// throw new RuntimeException("L'utilisateur n'existe pas,Veuillez vous connecter à nouveau");
// }
try {
// Validation token
if(user != null){
// JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(user.getTRADE_CENTER_NAME())).build();
// jwtVerifier.verify(token); //Analyser les données en fonction des jetons et des signatures
}
// if(exUserV2 != null){
// JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(exUserV2.getTRADE_CENTER_NAME())).build();
// jwtVerifier.verify(token); //Analyser les données en fonction des jetons et des signatures
}
} catch (Exception e) {
log.error("Aucunetoken,Veuillez vous connecter à nouveau");
throw new RuntimeException("Aucunetoken,Veuillez vous connecter à nouveau");
}
// UserConfig.setUser(exUserV2);
return true;
}
}
return true;
}
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
UserConfig.removeUser();
}
}3、Enregistrer un intercepteur personnalisé
Avec l'intercepteurPasswordStateInterceptor, L'enregistrement de l'intercepteur est également requis .À utiliserWebMvcConfigurerAdapter En basaddInterceptorsMéthodes. Nouvelle classeWebConfigfilter.java,DeWebMvcConfigurerAdapter .
@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {
/**
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(authenticationInterceptor())
.addPathPatterns("/**"); // Intercepter toutes les demandes,En jugeant si oui ou non @LoginRequired Notes Décider si une connexion est nécessaire
}
@Bean
public AuthenticationInterceptor authenticationInterceptor() {
return new AuthenticationInterceptor();
}
}IntercepteurHandlerInterceptorIl y a trois façons:
- preHandle
- postHandle
- afterCompletion
(1)preHandle (HttpServletRequest request, HttpServletResponse response, Object handle) Méthodes,Comme son nom l'indique,Cette méthode sera appelée avant le traitement de la demande.SpringMVC DansInterceptor C'est un appel en chaîne.,Il peut y avoir plus d'une demande en même temps ou dans une seule demandeInterceptor .ChaqueInterceptor L'appel de est exécuté dans l'ordre dans lequel il est déclaré,Et la première chose à faire estInterceptor DanspreHandle Méthodes,Il est donc possible d'effectuer une pré - initialisation ou un prétraitement de la requête courante dans cette méthode,Il est également possible de faire preuve d'un certain jugement dans le cadre de cette méthode pour décider si la demande doit être poursuivie ou non.La valeur de retour de la méthode est booléenneBoolean Type,Quand il revient àfalse Heure,Indique la fin de la demande,SuiviInterceptor EtController Il n'y aura plus d'exécution;Lorsque la valeur de retour esttrue Et il va continuer à appeler le prochainInterceptor DepreHandle Méthodes,Si c'est déjà le dernierInterceptor Lorsque la requête actuelle est appeléeController Méthodes.
(2)postHandle (HttpServletRequest request, HttpServletResponse response, Object handle, ModelAndView modelAndView) Méthodes,ParpreHandle Explication de la méthode nous savons que cette méthode comprend ce qui suit afterCompletion Les méthodes ne peuvent être utilisées qu'à l'heure actuelle Interceptor DepreHandle La valeur de retour de la méthode esttrue Pour être appelé.postHandle Méthodes, Comme son nom l'indique, après le traitement de la demande actuelle ,C'est - à - direController Exécuter après l'appel de méthode,Mais il seraDispatcherServlet Appelé avant que la vue ne retourne au rendu,Pour que nous puissions utiliser cette méthode pourController Après traitementModelAndView Objet à utiliser.postHandle La méthode est appelée dans la même direction quepreHandle C'est l'inverse,C'est - à - dire que ce qui a été déclaré en premierInterceptor DepostHandle La méthode a été appliquée après la réunion,Ceci etStruts2 À l'intérieur.Interceptor Le processus d'exécution est un peu typé .Struts2 À l'intérieur.Interceptor Le processus d'exécution est également en chaîne ,C'est juste queStruts2 Il doit être appelé manuellement. ActionInvocation Deinvoke Méthode pour déclencher la prochaine Interceptor OuAction Appel de,Et chaqueInterceptor Dansinvoke Tout ce qui précède l'appel de méthode est exécuté dans l'ordre déclaré ,Etinvoke Après la méthode, le contenu est inversé .
(3)afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handle, Exception ex) Méthodes,Cette méthode nécessite également une correspondance actuelleInterceptor DepreHandle La valeur de retour de la méthode esttrue Seulement quand.Comme son nom l'indique,Cette méthode sera appliquée après la fin de toute la demande,C'est - à - direDispatcherServlet Après avoir rendu la vue correspondante, exécutez.Le rôle principal de cette méthode est d'effectuer le nettoyage des ressources.
边栏推荐
- R语言使用自定义函数编写深度学习Leaky ReLU激活函数、并可视化Leaky ReLU激活函数
- A user level thread library based on C language
- 知道创宇为能源行业资产管理助力,入选工信部2021物联网示范项目
- curl: (56) Recv failure: Connection reset by peer
- 研究所的这些优势真香!上岸率还极高!
- Use SSH to pull codes
- Understanding adapter mode from home office | community essay solicitation
- @Component与@Configuration区别
- @Difference between component and @configuration
- Bags of Binary Words for Fast Place Recognition in Image Sequenc
猜你喜欢
随机推荐
Shenzhen internal promotion | Shenzhen Institute of computing science recruits assistant machine learning Engineer (school recruitment)
我的远程办公初体验 | 社区征文
sequential detector
Error:Connection refused: connect
Interrupt怎么用
Naacl 2022 | distillation of machinetranslation SOTA model
It is the same that robots can win gold medals without maintenance and out of bounds
2020版KALI安装教程
R语言使用epiDisplay包的kap函数(kap.2.raters函数)计算Kappa统计量的值(总一致性、期望一致性)、对两个评分对象的结果进行一致性分析、评分的类别为多个类别
What are the advantages of SaaS services
Collaborative development of epidemic home outsourcing project 𞓜 community essay solicitation
linux中mysql 1045错误如何解决
微信小程序开发储备知识
关于KALI使用xshell连接
mysql游标的作用是什么
关于Go中两个模块互相调用的场景解决方案
SpingMVC请求和响应
How to use interrupt
Open source warehouse contribution - submit pr
NAACL 2022 | 机器翻译SOTA模型的蒸馏









