0

我有一个基于 Spring MVC 的 Web 应用程序。目前在我的网页中,我在用户登录后显示用户的名字和姓氏。我这样做的方式是,对于进入 @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 方法中填充它,这将导致这个方法在整个应用程序的一个地方被调用?

4

2 回答 2

2

您想防止代码重复,这很好。这是你如何做到的。

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

  2. 后处理是我们唯一感兴趣的方法,因为其他方法返回默认值。

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

  4. Principal此处无法直接使用,您必须使用一些代码来查找它,例如SecurityContextHolder.getContext().getAuthentication().getPrincipal()

  5. 连接处理程序拦截器以拦截所有或部分控制器。

希望这可以帮助。

于 2013-04-24T20:46:27.990 回答
0

您可以使用Servlet FiltersSpring Interceptors

顺便说一句,您从哪里填充校长?

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

于 2013-04-24T18:16:53.277 回答