能够在Controller的方法里添加@CheckLogin为请求塞入UserId,再从方法中通过@RequestAttribute拿到吗

来源:11-12 AOP实现登录状态检查

慕桂英5194916

2020-02-10

大目老师好,
我现在在@CheckLogin的Aspect中为HttpServletRequest添加了UserId,UserId是从jwt token中解析出来的,设进Attribute中
request.setAttribute(“UserId”, claims.getSubject());
然后我希望在Controller中直接通过@RequestAttribute
@CheckLogin
public void test(@RequestAttribute(value = “UserId”, required = false) String userId)) {

}
拿到UserId,请问可以做到吗?
目前我尝试了是@CheckLogin的执行是在@RequestAttribute后一步,我只有在方法内通过
((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest().getAttribute(“UserId”)
才能拿到。
如果可以的话,可以再将@RequestAttribute定义在@ModelAttribute里面去,然后通过
public void test(@ModelAttribute(“userInfo”) UserInfo userInfo)) {
userInfo.getUserId();
}
的方式去得到UserId吗?
谢谢

写回答

1回答

大目

2020-02-10

很赞的问题。大致定位了一下源码,简单分析一下:

  1. @RequestAttribute由org.springframework.web.servlet.mvc.method.annotation.RequestAttributeMethodArgumentResolver处理;

  2. 而RequestAttributeMethodArgumentResolver由org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter处理

这两个东东都在@CheckLogin的之前就已经执行了。所以就导致拿不到值。

事实上,要想用@RequestAttribute拿到request的attribute,目前主要有三种途径:

  1. @ModelAttribute注解预存

  2. HandlerInterceptor拦截器中预存

  3. 请求转发带过来

就您问题的场景,我觉得第二种姿势比较合适。自己实现一下HandlerInterceptor,然后对@CheckLogin的方法处理即可。

目前我觉得思路可行,不过没有亲自测试过,您可以试试看。

1
2
大目
回复
慕桂英5194916
对的,在HandlerInterceptor做JWT的校验。 说得更通俗一点,就是把切面的代码挪到HandlerInterceptor里面去做。
2020-02-10
共2条回复

Spring Cloud Alibaba微服务从入门到进阶

面向未来微服务:熟练掌握Spring Cloud Alibaba

3129 学习 · 1327 问题

查看课程