Maison  >  Article  >  Java  >  Comment Java implémente-t-il le jeton de connexion utilisateur ?

Comment Java implémente-t-il le jeton de connexion utilisateur ?

PHPz
PHPzavant
2023-04-21 22:43:062419parcourir

1. Organigramme

Comment Java implémente-t-il le jeton de connexion utilisateur ?

2. Token

1. Il s'agit d'une chaîne cryptée avec une sécurité renforcée et prend en charge plusieurs domaines. vérifie que son ID utilisateur et son mot de passe sont légaux via la base de données, puis génère une chaîne de jeton basée sur le nombre aléatoire + ID utilisateur + horodatage actuel, puis cryptée par DES

    Bien sûr, la manière spécifique de générer le jeton est définie par le développeur
  • 3 , La génération de jetons utilise généralement uuid pour garantir l'unicité. Lorsque l'utilisateur se connecte, un jeton unique est généré pour l'utilisateur. Le stockage est généralement stocké dans la base de données. stocké deux fois dans le cookie ou la session, en fonction du cookie et du délai d'expiration de la session pour maintenir le délai d'expiration du jeton

    4. Le jeton est généré côté serveur. Si le frontal utilise le nom d'utilisateur/mot de passe pour demander l'authentification au serveur et que l'authentification côté serveur réussit, le serveur renverra un jeton au front-end. Le front-end peut apporter un jeton à chaque demande pour prouver son statut juridique. 5. Le jeton est un jeton. Sa plus grande caractéristique est le caractère aléatoire et l'imprévisibilité. Les pirates informatiques généraux ou les logiciels ne peuvent pas le deviner
  • 3. Analyse

Créez un jeton, donnez à l'utilisateur une valeur de jeton unique lors de la connexion et attribuez ce jeton lors de la connexion

Créé dans le projet SpringBoot Créer un TokenUtil Fichier .java dans un dossier Util

Dossier

public class TokenUtil {  
    private static Map<String, User> tokenMap = new HashMap<>();  
    public static String generateToken(User user){
        //生成唯一不重复的字符串
        String token = UUID.randomUUID().toString();
        tokenMap.put(token,user);
        return token;
    }
 
    /**
     * 验证token是否合法
     * @param token
     * @return
     */
    public static  boolean verify(String token){
        return tokenMap.containsKey(token);
    }
 
    public static User gentUser(String token){
        return tokenMap.get(token);
    }
 
    public static void main(String[] args) {
        for (int i = 0; i < 20; i++){
            System.out.println(UUID.randomUUID().toString());
        }
    } 
}
La connexion de l'utilisateur est UserController.java

@Api( tags = {"用户模块接口"})
@RestController
@RequestMapping("user")
public class UserController {
    @Autowired
    private UserService userService;
 
    @Autowired
    private HttpSession session;
    @ApiOperation("登录接口")
    @RequestMapping(value = "login",method ={RequestMethod.POST,RequestMethod.GET})
    public Map<String,Object> login(User user){
        Map<String,Object> map = new HashMap<>();
        map.put("code",0);
        if(StringUtils.isEmpty(user.getUsername()) || StringUtils.isEmpty(user.getPassword()) ){
            map.put("msg","用户或者密码为空!");
            return map;
        }
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("username",user.getUsername())
                .eq("password",user.getPassword());
        User userDb = userService.getOne(queryWrapper);
        if(userDb != null){
            String token= TokenUtil.generateToken(userDb);
            map.put("code",1);
            map.put("data",userDb);
            map.put("token",token);
            session.setAttribute("username",userDb.getUsername());
        }else{
            map.put("msg","用户名或密码错误!");
        }
        return map;
    }
    @ApiImplicitParams(
            {
            @ApiImplicitParam(name = "id",
                    value = "用户id", required = true,
                    dataType = "Long"),
            @ApiImplicitParam(name = "name",
                    value = "测试名字",
                    dataType = "string")
            }
    )
    @ApiOperation("根据id查询用户信息")
    @RequestMapping(value="getById",method ={RequestMethod.POST,RequestMethod.GET})
    public  User getById(Long id ,String name){
        System.out.println(name);
        return userService.getById(id);
    }
 
}

Utilisez l'intercepteur sur l'intercepteur sous LoginInterceptor.java

public class LoginInterceptor implements HandlerInterceptor {
 
    @Autowired
    private HttpSession httpSession;
 
    //Controller逻辑执行之前
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle....");
        String uri = request.getRequestURI();
        System.out.println("当前路径:"+uri);
        /**
         * HandlerMethod=>Controller中标注@RequestMapping的方法
         *  需要配置静态资源不拦截时,添加这块逻辑  => 前后端分离项目
         *
         */
        // 是我们的conrtoller中的方法
        if (!(handler instanceof HandlerMethod)) {
            return true;
        }
        String token = request.getHeader("qcby-token");
        if (!TokenUtil.verify(token)) {
            // 未登录跳转到登录界面
           throw  new RuntimeException("no login!");
        } else {
            return true;
        }
    }
 
    //Controller逻辑执行完毕但是视图解析器还未进行解析之前
    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle....");
    }
 
    //Controller逻辑和视图解析器执行完毕
    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
        System.out.println("afterCompletion....");
    }
}
Quatre résultats en cours d'exécution

http://localhost:8080/.

http://localhost:8080/user/login?username=admin&password=123456

Souvenez-vous de ce jeton Comment Java implémente-t-il le jeton de connexion utilisateur ?

60227b0e-bdbb-47d9-9df4 -f56163cb529d

Comment Java implémente-t-il le jeton de connexion utilisateur ?Écrivez le jeton dans le facteur

et la sortie est réussie

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer