Spring Boot-将参数从拦截器传递到控制器中的方法

时间:2019-11-19 20:50:05

标签: spring spring-boot spring-mvc interceptor

出于学习目的,我制作了一个自定义身份验证系统,在该系统中,我通过Authorization标头将令牌从客户端传递到服务器。

在服务器端,我想知道是否有可能在拦截器中创建请求,直到请求到达控制器中的方法之前,该用户对象具有来自令牌的电子邮件作为属性,然后将其传递给用户针对我需要的每个请求。

例如,这是我想要获得的:

@RestController
public class HelloController {

    @RequestMapping("/")
    public String index(final User user) {
        return user.getEmail();
    }

}

public class User {
    private String email;
}

user 是我在预拦截器中使用请求Authorization标头创建的对象,然后我可以或不可以将其传递给{{1}中的任何方法}。

这可能吗?

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;
   }
}