目录
一、流程图
二、Token
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....\"); } }
四、运行结果
http://localhost:8080/
http://localhost:8080/user/login?username=admin&password=123456
记住这个令牌
60227b0e-bdbb-47d9-9df4-f56163cb529d
在postman中
写入令牌,输出成功
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。
做猪小侠源码的代理,提供一站式服务
如果你不懂得搭建网站或者服务器,小程序,源码之类的怎么办? 第一通过本站学习各种互联网的技术 第二就是联系客服,我帮帮你搭建(当然要收取部分的费用) 第三成为我们的代理,我们提供整套的服务。