0

假设应用程序中有两种类型的角色 -

  1. 行政
  2. 区域经理

管理员可以获取所有办公室 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 过滤器中修改请求。有没有使用方法参数解析器的方法?

4

1 回答 1

1

根据评论,我在下面发布答案。

实现目标的最佳方法是添加一个过滤器,该过滤器在控制器处理请求之前运行。在此过滤器中,您可以应用适当的逻辑来确定请求用户的角色并采取相应的行动。如果您在所有控制器中遵循相同的 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?

只需通过使用角色定义的 URL 附加到您的路由来相应地更改请求路径,您就完成了。

于 2017-10-05T15:12:29.400 回答