当前位置:网站首页>【转载】token令牌在登录场景使用
【转载】token令牌在登录场景使用
2022-07-28 20:50:00 【如来神掌十八式】
public class TokenUtil {
/** * 创建map用于存储所有的令牌 */
private static Map<String, User> tokenMap=new HashMap<>();
/** * 生成token,存储token-user对应关系 * 返回token令牌 */
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);
}
}
在controller层中生成token令牌:
@RestController
@RequestMapping("user")
public class UserController {
@Autowired
private HttpSession session;
@Autowired
private UserService userService;
@RequestMapping(value = "login",method = {
RequestMethod.GET,RequestMethod.POST})
public Map<String,Object> login(User user){
Map<String,Object> map=new HashMap<>();
if(StringUtils.isEmpty(user.getUsername())||StringUtil.isEmpty(user.getPassword())){
map.put("code",0);
map.put("msg","用户未输入账户或密码");
}
QueryWrapper<User> queryWrapper=new QueryWrapper<>();
queryWrapper.eq("username",user.getUsername());
queryWrapper.eq("password",user.getPassword());
User one = userService.getOne(queryWrapper);
if(one!=null){
//生成token令牌
String token = TokenUtil.generateToken(user);
session.setAttribute("user",user.getUsername());
map.put("date",one);
map.put("code",1);
map.put("token",token);
}else{
map.put("msg","用户名或密码错误");
}
return map;
}
}
最后在拦截器中进行验证:
public class LoginInterceptor implements HandlerInterceptor {
@Autowired
private HttpSession httpSession;
//Controller逻辑执行之前
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String uri = request.getRequestURI();
System.out.println(uri);
/** * HandlerMethod=>Controller中标注@RequestMapping的方法 * 需要配置静态资源不拦截时,添加这块逻辑 => 前后端分离项目 */
if (!(handler instanceof HandlerMethod)) {
return true;
}
//从header中获取token令牌信息
String token = request.getHeader("token");
//进行验证
if (!TokenUtil.verify(token) &&httpSession.getAttribute("user") == null) {
// 未登录跳转到登录界面
response.sendRedirect("/user/toLogin");
return false;
} else {
return true;
}
}
//Controller逻辑执行完毕但是视图解析器还未进行解析之前
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
}
//Controller逻辑和视图解析器执行完毕
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
}
}
生成拦截器:
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginInterceptor()).addPathPatterns("/**")
// 那些路径不拦截
.excludePathPatterns("/user/login","/error","/swagger-ui.html/**","/swagger-resources/**");
}
@Bean
public LoginInterceptor loginInterceptor(){
return new LoginInterceptor();
}
}
进行测试时需要在请求头中放入token令牌信息。
token和session都是有实效的。
在登录后,每次重新启动项目都要进行一次登录,如果用户多的情况就会使数据库过载,使用token令牌时还有一个作用就是我们可以使用Redis缓存中间件对token令牌信息进行存储,在重新启动项目时,不会对已经登录的用户造成影响,不需要进行再次登录,让用户有更好的体验。
如下图:

也可以使用mysql数据库存储令牌信息但是Redis读写效率比数据库高
边栏推荐
- 成立不到一年!MIT衍生量子计算公司完成900万美元融资
- Ruiji takeout - background login function development
- gprs网络指的是什么
- HCIP(11)
- 微信小程序里button点击的时候会边框有黑线
- Hcip experiment (14)
- SQL injection less38 (Stack Injection)
- The function of wechat applet to cut pictures
- [CS231N]Lecture_ 2:Image Classification pipelin
- Leetcode integer exercises integer inversion
猜你喜欢

HCIP(12)

Ultra detailed visual studio 2019 running littlevgl (lvgl) simulator

2021 mathematical modeling group B exercise

(翻译)图技术简明历史

Lin Xiaobin, head of Tencent cloud database, borrowed 100 million yuan to speculate in stocks? Insider: the amount is not true

Sword finger offer II 052. flatten binary search tree (simple binary search tree DFS)

HCIP(12)

SQL注入 Less34(POST型宽字节注入+布尔盲注)

SQL injection less34 (post wide byte injection + Boolean blind injection)

npm ERR code ETIMEDOUT npm ERR syscall connect npm ERR errno ETIMEDOUT npm ERR network reques...
随机推荐
hcip实验(14)
Sword finger offer II 057. the difference between the value and the subscript is within the given range (medium array bucket sort sliding window TreeSet)
The binary search boundary value processing based on leetcode35 is used to clarify the boundary value of the judgment condition using the idea of interval
LCR测试仪最为主要的功能和用途都是什么
How to realize dynamic route switching and route caching in vuejs
SQL injection less38 (Stack Injection)
Hcip experiment (15)
PaddleNLP基于ERNIR3.0文本分类以中医疗搜索检索词意图分类(KUAKE-QIC)为例【多分类(单标签)】
Sword finger offer II 065. The shortest word code (medium dictionary tree string array)
ATT&CK初步了解
使用webWorker执行后台任务
HCIP(12)
HCIP(8)
75. Color classification (medium array double pointer sorting)
HCIP(8)
HCIP第七次实验
Ecmasript 5/6 notes
HCIP(9)
Leetcode question brushing series - sum of majority type
Remember the first line segment tree (corresponding to Luogu 3372)

