关于响应的token问题

来源:5-11 观察Emos后端项目运行细节

杨清川

2022-08-21

@ApiOperation("注册用户方法")
@PostMapping("/register")
public R register(@Valid @RequestBody RegisterForm form){
    //根据UserID生成token
    RegisterUserDto userDto = new RegisterUserDto();
    BeanUtils.copyProperties(form,userDto);
    int userId = userService.registerUser(userDto);
    //生成token字符串
    String token = jwtUtil.createToken(userId);
    //获取该用户的权限列表
    Set<String> permissions = userService.searchUserPermissions(userId);
    //把token缓存到redis
    saveCacheToken(token, userId);
    //返回前端响应
    return R.ok("register成功").put("token",token).put("permission",permissions);
}
@PostMapping("/login")
@ApiOperation("用户登录接口")
public R login(@Valid @RequestBody LoginForm form){
    Integer userId = userService.login(form.getCode());
    //生成token字符串
    String token = jwtUtil.createToken(userId);
    //获取该用户的权限列表
    Set<String> permissions = userService.searchUserPermissions(userId);
    //把token缓存到redis
    saveCacheToken(token, userId);
    //返回前端响应
    return R.ok("login成功").put("token",token).put("permission",permissions);
}

无论是login功能还是注册功能,都已经手动的put token字符串了

那么Aop类中的环绕通知中的put token怎么用上的。

@Component
@Aspect
public class TokenAspect {

    @Resource
    private ThreadLocalToken threadLocalToken;

    @Pointcut("execution(public * com.yada.emos.wx.controller.*.*(..)))")
    public void aspect(){
    }

    /**
     * 使用环绕通知,去存放token的媒介类中查看是否有新的token生成
     * 如果有则放入R对象一起返回,没有则不做处理
     * @param point
     * @return
     * @throws Throwable
     */
    @Around("aspect()")
    public Object around(ProceedingJoinPoint point) throws Throwable {
        R r = (R)point.proceed();
        String token = threadLocalToken.getToken();
        if (token != null) {
            r.put("token", token);
            threadLocalToken.clear();
        }
        return r;
    }

}



写回答

1回答

神思者

2022-08-22

你先深入学习Java的ThreadLocal机制,把这个东西先吃透

0
1
海獭476316
老师同问这个问题还是不太理解
2023-11-25
共1条回复

SpringBoot 在线协同办公小程序开发 全栈式项目实战

未来趋势型业务 + 前后端综合技术栈 + 惊艳的细节打磨

1798 学习 · 1915 问题

查看课程