我有一个基于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方法中填充它,这将导致在整个应用程序中只在一个地方调用此方法?
答案 0 :(得分:2)
您希望防止重复代码。这是你如何做到的。
创建自定义HandlerInterceptor
http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/web/servlet/HandlerInterceptor.html
发布句柄是我们唯一感兴趣的方法,其他方法则返回默认值。
在post handle方法中,您可以访问从控制器返回的模型和视图,继续添加您想要的任何内容。
Principal
将无法在此处直接使用,您必须使用SecurityContextHolder.getContext().getAuthentication().getPrincipal()
连接处理程序拦截器以拦截所有或部分控制器。
希望这有帮助。
答案 1 :(得分:0)
您可以使用Servlet Filters
或Spring Interceptors
。
无论如何,那就是你应该填充这些东西的地方。