@ControllerAdvice 中的方法被执行多次

刚学后端跟着课程做demo的时候, 权限校验用的是session 或者 sessionId + redis的方式 .
但是这样子有个很麻烦的地方就是, 业务逻辑那一块只需要一个userId, 但我每次都需要将user整个取出来再获取userId
(为了方便表达我的问题的具体意思, 后面涉及到的jwt的所有加解密的过程都省略掉了.)

User user = (User) session.getAttribute("user")
Long userId = user.getId()

现在嫌每次获取userId太麻烦, 然后现在尝试着换用jwt验证. 就是载荷中只放一个userId

public static String generateToken(Long userId) {
    Date exp = DateTime.now().plusMinutes(30).toDate();
    return Jwts.builder()
            .claim("user_id", userId)
            .setExpiration(exp)
            .signWith(SignatureAlgorithm.HS256, secret)
            .compact();
}

这样子在收到客户请求的时候通过请求头通过对应的加解密能轻松获取到对应的userId
但是相应的controller却要在controller层多加一个HttpServeltRequest request,感觉也还不够好

@RequestMapping("/login")
    public void login(@RequestParam("account") String account, @RequestParam("password") String password, HttpServletRequest request) {
        Long userId = (Long) request.getHeader("user_id");
    }

百度了controller层的增强方法, 得知有一个叫ControllerAdvice的方法, 于是我再手写一个BaseController对象, 让所有的controller对象继承这个BaseController, 然后每次请求先在BaseController那里增强一下, 获取到对应的userId, 然后将userId复制给父类成员, 这样在子类成员里面就能直接获取到userId, 并且做相应的业务操作了

@ControllerAdvice
@Slf4j
public class BaseController {

    public Long userId;
    
    public int count;
    
    @ModelAttribute
    public void newUser(HttpServletRequest request) {
        Long userId = request.getHeader("user_id");
        log.info("第{}次执行", ++count);
    }
}

但是我从终端发送 请求了一下该接口
curl http://localhost:8080/client/user/login

发现后端ControllerAdvice中标记的增强方法被执行了5次

clipboard.png

在网络上面找了好久, 根本没有相应的文章说明这个问题的存在,
希望好心人帮助

阅读 2.5k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题