出于学习目的,我制作了一个自定义身份验证系统,在该系统中,我通过Authorization
标头将令牌从客户端传递到服务器。
在服务器端,我想知道是否有可能在拦截器中创建请求,直到请求到达控制器中的方法之前,该用户对象具有来自令牌的电子邮件作为属性,然后将其传递给用户针对我需要的每个请求。
例如,这是我想要获得的:
@RestController
public class HelloController {
@RequestMapping("/")
public String index(final User user) {
return user.getEmail();
}
}
public class User {
private String email;
}
user 是我在预拦截器中使用请求Authorization
标头创建的对象,然后我可以或不可以将其传递给{{1}中的任何方法}。
这可能吗?
答案 0 :(得分:2)
我将使用@Bean
请求创建一个@Scope
,该请求将保留用户,然后将适当的实体放入该所有者,然后从方法内的该所有者获取。
@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;
}
}