基于用户信息的Spring调用控制器方法

时间:2017-10-04 20:13:27

标签: spring methods controller userinfo

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

  1. 管理
  2. 区域经理
  3. 管理员可以获得所有办公室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
    }
    

    现在我希望我的所有用户仅使用no-arg版本发出请求(第一种方法)。系统应该在击中控制器之前获得用户角色并且调用适当的控制器方法(如果管理员然后调用第一种方法,如果区域经理调用具有适当区域的第二种方法)。

    问题是,它有可能吗?如果是,那么最好的方法是什么呢?我可以尝试在servlet过滤器中修改请求。有没有办法使用方法参数解析器?

1 个答案:

答案 0 :(得分: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?

只需通过使用角色定义的网址附加到您的路线即可相应更改请求路径。