Rumah  >  Artikel  >  Java  >  Bagaimanakah Java melaksanakan token log masuk pengguna?

Bagaimanakah Java melaksanakan token log masuk pengguna?

PHPz
PHPzke hadapan
2023-04-21 22:43:062477semak imbas

1. Carta Aliran

Bagaimanakah Java melaksanakan token log masuk pengguna?

2. Token

1. Token ialah mekanisme pengesahan pelanggan, yang merupakan rentetan yang disulitkan -domain

2. Apabila pengguna log masuk buat kali pertama, pelayan mengesahkan bahawa UserId dan Kata Laluan adalah sah melalui pangkalan data, dan kemudian menjana rentetan token berdasarkan nombor rawak + userid + cap waktu semasa dan penyulitan DES.

  • Sudah tentu, cara khusus untuk menjana token ditakrifkan oleh pembangun

3 memastikan keunikan. Apabila pengguna Token unik dijana untuknya semasa log masuk, dan storan biasanya disimpan dalam pangkalan data

  • Masa tamat tempoh token adalah untuk menyimpan token dua kali dalam kuki atau sesi, dan tentukannya berdasarkan masa tamat tempoh kuki dan sesi masa tamat tempoh penyelenggaraan

4. Token dijana pada bahagian pelayan. Jika bahagian hadapan menggunakan nama pengguna/kata laluan untuk meminta pengesahan daripada pelayan, dan pengesahan bahagian pelayan berjaya, pelayan akan mengembalikan Token ke bahagian hadapan. Bahagian hadapan boleh membawa Token dengan setiap permintaan untuk membuktikan status sahnya

5. Token ialah token, dan ciri terbesarnya ialah rawak dan tidak dapat diramalkan. Penggodam atau perisian umum tidak dapat menekanya

3 Analisis

Buat token token, berikan nilai token unik kepada pengguna semasa log masuk dan tetapkan nilai token ini apabila log masuk Brand.

Buat folder Util dalam projek SpringBoot

Buat fail TokenUtil.java dalam 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());
        }
    } 
}

Log masuk pengguna Dapatkan 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);
    }
 
}

dan kendalikan pemintas pada pemintas 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. Menjalankan hasil

http://localhost:8080/.

Bagaimanakah Java melaksanakan token log masuk pengguna?

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

Bagaimanakah Java melaksanakan token log masuk pengguna?

Ingat Token ini

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

Tulis arahan dalam posmen

Bagaimanakah Java melaksanakan token log masuk pengguna?

Kad,>

Bagaimanakah Java melaksanakan token log masuk pengguna?

Atas ialah kandungan terperinci Bagaimanakah Java melaksanakan token log masuk pengguna?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam