SpringBoot实现token登录的示例代码
为什么引入token机制?
在进行登录验证时,我们需要session或cookie会话进行验证,客户端包括浏览器、app、微信小程序、公众号,只有浏览器有session和cookie机制,当我们脱离浏览器用app等向服务端发请求就没有session和cookie机制,这时我们就需要使用token令牌进行登录验证。
代码实现
先建个util包,并创建TokenUtil类用于生成token
TokenUtil类代码
package com.qcby.util; import com.qcby.entity.User; import java.util.HashMap; import java.util.Map; import java.util.UUID; public class TokenUtil { /** * 创建map用于存储所有的令牌 * * token - User */ private static Map<String, User> tokenMap=new HashMap<>(); /** * 生成token,存储token-user对应关系 * 返回token令牌 * @param user * @return */ 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); } /** * 根据token获取用户信息 * @param token * @return */ public static User getUser(String token){ return tokenMap.get(token); } }
LoginInterceptor类代码
package com.qcby.interceptor; import com.qcby.util.TokenUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; public class LoginInterceptor implements HandlerInterceptor { //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的方法 * 需要配置静态资源不拦截时,添加这块逻辑 => 前后端分离项目 */ 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...."); } }
实现类
@RestController @RequestMapping("user") public class UserController { @Autowired private UserService userService; @ApiOperation("用户登录接口") @RequestMapping(value="login",method = {RequestMethod.GET,RequestMethod.POST}) 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 user1=userService.getOne(queryWrapper); if(user1!=null){ String token= TokenUtil.generateToken(user1); map.put("cod",1); map.put("data",user1); map.put("token",token); }else { map.put("msg","用户名或密码错误!"); } return map; } }
拦截器类可以参考这篇文章,这个token验证就是在拦截器上改动的。
需要有postman验证
到此这篇关于SpringBoot实现token登录的示例代码的文章就介绍到这了,更多相关SpringBoot token登录内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
浅谈StringEntity 和 UrlEncodedFormEntity之间的区别
这篇文章主要介绍了StringEntity 和 UrlEncodedFormEntity之间的区别,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-06-06Java中ThreadLocal使用原理及Synchronized区别
ThreadLocal叫做线程变量,本文详细的介绍了ThreadLocal使用原理及Synchronized区别,有需要的朋友可以参考一下,希望对你有所帮助。2023-05-05mybatis实现批量插入并返回主键(xml和注解两种方法)
这篇文章主要介绍了mybatis实现批量插入并返回主键(xml和注解两种方法),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-12-12java jackson 将对象转json时,忽略子对象的某个属性操作
这篇文章主要介绍了java jackson 将对象转json时,忽略子对象的某个属性操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2020-10-10springmvc配置线程池Executor做多线程并发操作的代码实例
今天小编就为大家分享一篇关于springmvc配置线程池Executor做多线程并发操作的代码实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧2019-03-03解决SecureRandom.getInstanceStrong()引发的线程阻塞问题
这篇文章主要介绍了解决SecureRandom.getInstanceStrong()引发的线程阻塞问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-12-12
最新评论