推荐解决方案
我将创建一个带有@Scope 请求的@Bean 请求,该请求将持有用户,然后将适当的实体放入该持有人,然后在方法内从该持有人获取。
@Component
@Scope("request")
public class CurrentUser {
private User currentUser;
public User getCurrentUser() {
return currentUser;
}
public void setCurrentUser(User currentUser) {
this.currentUser = currentUser;
}
}
然后
@Component
public class MyInterceptor implements HandlerInterceptor {
private CurrentUser currentUser;
@Autowired
MyInterceptor(CurrentUser currentUser) {
this.currentUser = currentUser;
}
@Override
public boolean preHandle(
HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
this.currentUser.setCurrentUser(new User("whatever"));
return true;
}
}
在控制器中
@RestController
public class HelloController {
private CurrentUser currentUser;
@Autowired
HelloController(CurrentUser currentUser) {
this.currentUser = currentUser;
}
@RequestMapping("/")
public String index() {
return currentUser.getCurrentUser().getEmail();
}
}
替代解决方案
如果您想要的对象只包含一个字段,您可以作弊并将该字段添加到HttpServletRequest 参数中,然后就可以看到奇迹发生了。
@Component
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(
HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//TRY ONE AT THE TIME: email OR user
//BOTH SHOULD WORK BUT SEPARATELY OF COURSE
request.setAttribute("email", "login@domain.com");
request.setAttribute("user", new User("login@domain.com"));
return true;
}
}