#1、token是一種客戶端認證機制,是一個經過加密的字串,安全性強,支援跨網域
2、使用者第一次登錄,伺服器透過資料庫校驗其UserId和Password合法,則再根據隨機數字userid 當前時間戳再經過DES加密產生一個token串
當然具體產生token的方式是開發自己定義的
3、token的生成一般是採用uuid保證唯一性,當使用者登入時為其產生唯一的token,儲存一般保存在資料庫中
token過期時間採用把token二次保存在cookie或session裡面,根據cookie和session的過期時間去維護token的過期時間
4、Token是在服務端產生的。如果前端使用使用者名稱/密碼向服務端請求認證,服務端認證成功,那麼在服務端會回傳Token給前端。前端可以在每次請求的時候帶上Token證明自己的合法地位
5、Token,就是令牌,最大的特點就是隨機性,不可預測。一般駭客或軟體無法猜測出來
建立一個token令牌,在使用者登入時候給使用者一個獨特得令牌值,登入時嘚賦值這個令牌
在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); } }
在攔截器上操作interceptor下面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...."); } }
#60227b0e-bdbb-47d9-9df4-f56163cb529d在postman中 ###################################################### ##########
以上是Java如何實作使用者登入的Token令牌?的詳細內容。更多資訊請關注PHP中文網其他相關文章!