能够在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
很赞的问题。大致定位了一下源码,简单分析一下:
@RequestAttribute由org.springframework.web.servlet.mvc.method.annotation.RequestAttributeMethodArgumentResolver处理;
而RequestAttributeMethodArgumentResolver由org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter处理
这两个东东都在@CheckLogin的之前就已经执行了。所以就导致拿不到值。
事实上,要想用@RequestAttribute拿到request的attribute,目前主要有三种途径:
@ModelAttribute注解预存
HandlerInterceptor拦截器中预存
请求转发带过来
就您问题的场景,我觉得第二种姿势比较合适。自己实现一下HandlerInterceptor,然后对@CheckLogin的方法处理即可。
目前我觉得思路可行,不过没有亲自测试过,您可以试试看。
122020-02-10
相似问题