当前位置:网站首页>【转载】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读写效率比数据库高
边栏推荐
- hcip实验(12)
- PaddleNLP基于ERNIR3.0文本分类以CAIL2018-SMALL数据集罪名预测任务为例【多标签】
- HCIP(9)
- Can the MySQL create statement be used to create a table structure and append new records
- HCIP(8)
- (翻译)图技术简明历史
- [Ruiji takeout project]day4 - dish management
- HCIP第七次实验
- What is time complexity
- Sword finger offer II 055. Binary search tree iterator (medium binary search tree iterator)
猜你喜欢

普源示波器实际的使用效果怎么样

Alibaba cloud CDN practice

HCIP(15)

Overall introduction of Ruiji takeout project

软考网络工程师

If you want to grow rapidly, you must first experience a major blow!

HCIP(12)

Idea generate class diagram plug-in UML (super detailed)

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

2021 mathematical modeling group B exercise
随机推荐
[CS231N]Lecture_ 2:Image Classification pipelin
Day3 classification management of Ruiji takeout project
HCIP(11)
TensorFlow Serving 高性能的机器学习模型服务系统
Hcip experiment (12)
Static details of static members
HCIP(12)
Sword finger offer II 064. magic Dictionary (medium dictionary tree string design)
Establishment of Ruiji takeout development environment
CDN working principle
What does GPRS network mean
使用webWorker执行后台任务
Less than a year after its establishment! MIT derivative quantum computing company completed financing of US $9million
mysql create语句能不能用来建立表结构并追加新的记录
Idea generate class diagram plug-in UML (super detailed)
HCIP(10)
SQL injection less34 (post wide byte injection + Boolean blind injection)
Summary of the use of hash table set and map when leetcode brushes questions
Static route and default route experiment
2021 mathematical modeling group B exercise

