将参数传递给控制器
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 找到更广泛的示例。
【讨论】:
以上是关于将参数传递给控制器的主要内容,如果未能解决你的问题,请参考以下文章