Spring根据用户信息调用controller方法
Spring calling controller method based on user information
假设应用程序中有两种类型的角色 -
- 管理员
- 区域经理
管理员可以获得所有办公室 ID,而区域经理只能获得在他的区域下分配的办公室。在控制器中我想要这样的东西
@RequestMapping(method = RequestMethod.GET)
Collection<Long> getOfficeIds(){
// returns all office ids in system
}
@RequestMapping(method = RequestMethod.GET, value = "/{zoneId}")
Collection<Long> getOfficeIds(@RequestParam("zoneId") long zoneId){
// returns all office ids in the zone
}
现在我希望所有用户仅使用无参数版本发出请求(第一种方法)。系统应该 在点击控制器之前获得用户角色 并且应该 调用适当的控制器方法 (如果管理员调用第一个方法,如果区域经理调用第二个一个有适当区域的)。
问题是,这可能吗?如果是,那么最好的方法是什么?我可以尝试修改 servlet 过滤器中的请求。有没有办法使用方法参数解析器?
根据评论,我在下面发布答案。
要实现您的目标,最好的办法是添加一个在控制器处理请求之前运行的过滤器。在此过滤器中,您可以应用适当的逻辑来确定请求用户的角色并采取相应的行动。如果您在所有控制器中遵循相同的 URL 模式来处理这些不同的情况,您可以在确定要应用哪种情况后简单地重写内部 URL 以便它可以由适当的控制器处理。通过这种方式,您可以将所有用户角色逻辑保存在一个位置,而您的控制器逻辑可以相应地处理它们自己的独立流。
要使用 spring 创建这样的过滤器,您可以执行如下操作:
@Component("accountContextFilter") public class AccountContextFilter extends OncePerRequestFilter {
public void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException{
//user role and routing logic
}
}
可以在此处找到 doFilterInternal 内部逻辑的参考:How to use a servlet filter in Java to change an incoming servlet request url?
通过使用角色定义的 URLs 附加到您的路由来相应地更改请求路径,您就完成了。
假设应用程序中有两种类型的角色 -
- 管理员
- 区域经理
管理员可以获得所有办公室 ID,而区域经理只能获得在他的区域下分配的办公室。在控制器中我想要这样的东西
@RequestMapping(method = RequestMethod.GET)
Collection<Long> getOfficeIds(){
// returns all office ids in system
}
@RequestMapping(method = RequestMethod.GET, value = "/{zoneId}")
Collection<Long> getOfficeIds(@RequestParam("zoneId") long zoneId){
// returns all office ids in the zone
}
现在我希望所有用户仅使用无参数版本发出请求(第一种方法)。系统应该 在点击控制器之前获得用户角色 并且应该 调用适当的控制器方法 (如果管理员调用第一个方法,如果区域经理调用第二个一个有适当区域的)。
问题是,这可能吗?如果是,那么最好的方法是什么?我可以尝试修改 servlet 过滤器中的请求。有没有办法使用方法参数解析器?
根据评论,我在下面发布答案。
要实现您的目标,最好的办法是添加一个在控制器处理请求之前运行的过滤器。在此过滤器中,您可以应用适当的逻辑来确定请求用户的角色并采取相应的行动。如果您在所有控制器中遵循相同的 URL 模式来处理这些不同的情况,您可以在确定要应用哪种情况后简单地重写内部 URL 以便它可以由适当的控制器处理。通过这种方式,您可以将所有用户角色逻辑保存在一个位置,而您的控制器逻辑可以相应地处理它们自己的独立流。
要使用 spring 创建这样的过滤器,您可以执行如下操作:
@Component("accountContextFilter") public class AccountContextFilter extends OncePerRequestFilter {
public void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException{
//user role and routing logic
}
}
可以在此处找到 doFilterInternal 内部逻辑的参考:How to use a servlet filter in Java to change an incoming servlet request url?
通过使用角色定义的 URLs 附加到您的路由来相应地更改请求路径,您就完成了。