将参数传递给控制器

Posted

技术标签:

【中文标题】将参数传递给控制器【英文标题】:Pass parameter to controller 【发布时间】:2018-07-14 01:49:21 【问题描述】:

我有一些带有 JWT 身份验证的应用程序。目前,我有这样的控制器:

@RestController
@RequestMapping("users")
public class UserController 
    @PostMapping(value = "userId/rate/inc")
    public Double incRate(@PathVariable Long userId) 
        return service.incUserRate(userId);
    

但是,我想通过过滤器中的令牌获取用户并将其作为方法的参数传递。例如:

@PostMapping(value = "/rate/inc")
public Double incRate(User user) 
    returnservice.incUserRate(user);

这可能吗?

【问题讨论】:

【参考方案1】:

实现argument resolver 并将您需要的一切注入您的控制器。

默认情况下,Spring 允许您注入默认包含用户电子邮件的 Principal 对象(这是 Spring Security 中的默认实现)。但是您可以通过实现Interface HandlerMethodArgumentResolver<User> 来实现注入您的业务登录用户帐户。

我建议你创建一个像 @AuthorizedUser 这样的注解,用这个注解标记你的 User 参数。并根据控制器方法中的此注释存在,通过HandlerMethodArgumentResolver 注入您的用户。

@Component
public class UserArgumentHandlerResovler implements HandlerMethodArgumentResolver 

    @Autowired
    private UserRepository userRepository;

    public boolean supportsParameter(MethodParameter parameter) 
        return parameter.isAnnotationPresent(AuthorizedUser.class);
    

    public Object   resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory)  
         Authentication auth = SecurityContextHolder.getContext().getAuthentication();
         String email = (String) auth.getPrincipal(); // <- it is a pseudocode, check your Authentication implementation to get email for example.
         return userRepository.findByEmail(email);
    

【讨论】:

AuthorizedUser 类有什么?可以发一下吗? AuthorizedUser 只是一个标记注释,您可以省略它并使用不同的方法来识别您的特定用户。【参考方案2】:

如果您使用 Spring Security,您可以解析当前用户,然后将其提供给您的控制器方法。但是——如果我没记错的话——你必须将它声明为Principal:

@PostMapping(value = "/rate/inc")
public Double incRate(Principal principal) 
    returnservice.incUserRate((User)principal);

可以在Baeldung 找到更广泛的示例。

【讨论】:

以上是关于将参数传递给控制器的主要内容,如果未能解决你的问题,请参考以下文章

将许多参数传递给控制器​​的好方法是啥?

MVC - 将整个模型作为参数传递给 JavaScript 中的 Url.Action

将参数传递给从另一个控制器公开的方法

您可以在创建时将参数传递给 AngularJS 控制器吗?

您可以在创建时将参数传递给 AngularJS 控制器吗?

Angularjs - 将参数传递给指令