当前位置:网站首页>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.
边栏推荐
- 我的远程办公初体验 | 社区征文
- 【现代信号处理第六次作业】
- In depth analysis of Monai (I) data and transforms
- PCB板框的绘制——AD19
- Open source warehouse contribution - submit pr
- Function calculation asynchronous task capability introduction - task trigger de duplication
- 基于深度学习的Wiki中文语料词word2vec向量模型
- 535. TinyURL 的加密与解密 / 剑指 Offer II 103. 最少的硬币数目
- 为什么信息化 ≠ 数字化?终于有人讲明白了
- 垃圾收集器
猜你喜欢

LeetCode 每日一题——535. TinyURL 的加密与解密

自动收售报机

NAACL 2022 | 机器翻译SOTA模型的蒸馏

c# 国内外ORM 框架 dapper efcore sqlsugar freesql hisql sqlserver数据常规插入测试性能对比

In depth analysis of Monai (I) data and transforms

基于汇编实现的流载体的LSB隐藏项目

Mysql中锁的使用场景是什么

SLAM中的子图

机器学习7-支持向量机

Word2vec vector model of Wiki Chinese corpus based on deep learning
随机推荐
Kubernetes deployment dashboard (Web UI management interface)
Multi mode concurrent implementation of tortoise and rabbit race in go language
The fixed assets management system enables enterprises to dynamically master assets
Shenzhen internal promotion | Shenzhen Institute of computing science recruits assistant machine learning Engineer (school recruitment)
KUKA子程序/函数怎么建立和使用方法
Collaborative development of epidemic home outsourcing project 𞓜 community essay solicitation
线段树、树状数组模板(复制粘贴确实好用)
regular expression
What are the advantages of SaaS services
Viewing splitchunks code segmentation from MPX resource construction optimization
6.26cf simulation game d: black and white questions
正则表达式
Word2vec vector model of Wiki Chinese corpus based on deep learning
关于Go中两个模块互相调用的场景解决方案
外部自动(PLC启动机器人)
c# 国内外ORM 框架 dapper efcore sqlsugar freesql hisql sqlserver数据常规插入测试性能对比
Development of freedom free agreement pledge mining system
【南京大学】考研初试复试资料分享
有遇到用flink-cdc采集MySQL-RDS的时候,datetime类型的字段,采集过来后和源表
Online sql to CSV tool