ホームページ  >  記事  >  Java  >  Java はユーザー ログイン トークンをどのように実装しますか?

Java はユーザー ログイン トークンをどのように実装しますか?

PHPz
PHPz転載
2023-04-21 22:43:062477ブラウズ

1. フローチャート

Java はユーザー ログイン トークンをどのように実装しますか?

2. トークン

1. トークンはクライアント認証メカニズムであり、暗号化された文字列です。強力なセキュリティ、相互接続をサポートします。 -domain

2. ユーザーが初めてログインすると、サーバーはデータベースを通じてユーザー ID とパスワードが正当であることを検証し、乱数のユーザー ID と現在のタイムスタンプに基づいてトークン文字列を生成します。 DES 暗号化による

  • ##もちろん、トークンを生成する具体的な方法は開発者によって定義されます

3. トークンの生成では、一般的に一意性を確保するために uuid が使用されます。ユーザーがログインすると、その時点で一意のトークンが生成され、通常、ストレージはデータベースに保存されます。

  • トークンの有効期限は、トークンを 2 回保存することです。トークンの有効期限

#4. トークンはサーバー側で生成されます。フロントエンドがユーザー名/パスワードを使用してサーバーに認証を要求し、サーバー側の認証が成功した場合、サーバーはフロントエンドにトークンを返します。フロントエンドは、法的ステータスを証明するために各リクエストにトークンを持ち込むことができます。

5. トークンはトークンであり、その最大の特徴はランダム性と予測不可能性です。通常、ハッカーやソフトウェアはそれを推測することはできません

3. 分析

トークン トークンを作成し、ログイン時にユーザーに一意のトークン値を与えます。ログイン時にこのトークン値を割り当てます。

SpringBoot プロジェクトに Util フォルダーを作成します

フォルダーの下に TokenUtil.java ファイルを作成します

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....");
    }
}

4. 実行結果

http://localhost:8080/

Java はユーザー ログイン トークンをどのように実装しますか?

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

Java はユーザー ログイン トークンをどのように実装しますか?## このトークンを覚えておいてください

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

ポストマンで

Java はユーザー ログイン トークンをどのように実装しますか?トークンを書き込むと出力が成功します

以上がJava はユーザー ログイン トークンをどのように実装しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。