>  기사  >  Java  >  Java는 사용자 로그인 토큰을 어떻게 구현합니까?

Java는 사용자 로그인 토큰을 어떻게 구현합니까?

PHPz
PHPz앞으로
2023-04-21 22:43:062420검색

1. Flowchart

Java는 사용자 로그인 토큰을 어떻게 구현합니까?

2. 토큰은 강력한 보안을 갖춘 암호화된 문자열이며, 크로스 도메인을 지원합니다. 데이터베이스를 통해 UserId 및 Password가 적법한지 확인한 다음 난수 + 사용자 ID + 현재 타임스탬프를 기반으로 토큰 문자열을 생성한 다음 DES로 암호화합니다.

물론 토큰을 생성하는 구체적인 방법은 다음과 같이 정의됩니다. 개발자

  • 3 , 토큰 생성은 일반적으로 사용자가 로그인하면 사용자에 대해 고유한 토큰이 생성됩니다. 토큰 만료 시간은 토큰을 사용합니다. 토큰 만료 시간을 유지하기 위해 쿠키 및 세션 만료 시간에 따라 쿠키 또는 세션에 두 번 저장됩니다.

4. 토큰은 서버 측에서 생성됩니다. 프런트 엔드가 사용자 이름/비밀번호를 사용하여 서버에 인증을 요청하고 서버 측 인증이 성공하면 서버는 프런트 엔드에 토큰을 반환합니다. 5. 토큰의 가장 큰 특징은 무작위성과 예측 불가능성입니다. 일반 해커나 소프트웨어는 추측할 수 없습니다

    3. 분석
  • 토큰 토큰을 생성하고, 로그인 시 사용자에게 고유한 토큰 값을 제공하고, 로그인 시 이 토큰을 할당합니다.

SpringBoot 프로젝트에서 생성됨 TokenUtil 생성 Util 폴더의 .java 파일

Folder

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());
        }
    } 
}

사용자 로그인은 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);
    }
 
}
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....");
    }
}

Four 아래의 인터셉터에서 인터셉터를 작동합니다.

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

이 토큰을 기억하세요

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

Java는 사용자 로그인 토큰을 어떻게 구현합니까?

우편 배달부에 토큰 쓰기

Java는 사용자 로그인 토큰을 어떻게 구현합니까?

출력이 성공했습니다

위 내용은 Java는 사용자 로그인 토큰을 어떻게 구현합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제