spring自动填充每个请求的用户详细信息

时间:2013-04-24 16:29:27

标签: spring-mvc

我有一个基于MVC的Spring应用程序。目前在我的网页中,我在用户登录后显示用户的名字和姓氏。我这样做的方式是,对于@ Controller @RequestMapping中的每个HttpServletRequest,我获取Principal对象并从中获取用户详细信息然后,使用firstname和lastname属性填充ModelMap。例如,这里是示例代码

@Autowired
private SecurityDetails securityDetails;

@RequestMapping(method = RequestMethod.GET)
public String showWelcomePage(HttpServletRequest request,
        HttpServletResponse response, ModelMap model, Principal principal)
{
    securityDetails.populateUserName(model, principal);
            ... lot of code here;
    return "home";
}



public boolean populateUserName(ModelMap model, Principal principal) {
    if (principal != null) {
        Object ob = ((Authentication)principal).getPrincipal();
        if(ob instanceof MyUserDetails)
        {
            MyUserDetails ud = (MyUserDetails)ob;
            model.addAttribute("username", ud.getFirstName() + " " + ud.getLastName());
        }
        return true;
    }
    else
    {
        logger.debug("principal is null");
        return false;
    }
}

我的问题是我必须为每个RequestMapping调用populateUserName方法。是否有一种优雅的方式,比如在Interceptor方法中填充它,这将导致在整个应用程序中只在一个地方调用此方法?

2 个答案:

答案 0 :(得分:2)

您希望防止重复代码。这是你如何做到的。

  1. 创建自定义HandlerInterceptor http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/web/servlet/HandlerInterceptor.html

  2. 发布句柄是我们唯一感兴趣的方法,其他方法则返回默认值。

  3. 在post handle方法中,您可以访问从控制器返回的模型和视图,继续添加您想要的任何内容。

  4. Principal将无法在此处直接使用,您必须使用SecurityContextHolder.getContext().getAuthentication().getPrincipal()

  5. 等代码查找
  6. 连接处理程序拦截器以拦截所有或部分控制器。

  7. 希望这有帮助。

答案 1 :(得分:0)

您可以使用Servlet FiltersSpring Interceptors

顺便说一句,你在哪里填充校长?

无论如何,那就是你应该填充这些东西的地方。