【发布时间】:2013-08-16 01:37:34
【问题描述】:
我有一个 spring-mvc 应用程序,它当前有两个通道 - Web 应用程序和一个 REST 服务。两者都有用户的 http 会话,我可以轻松地在我的服务类中获取“当前用户”。
现在我需要开发另一个没有 http 会话并且当前用户依赖于请求参数的 REST 服务。因此控制器会读取该请求参数并找到当前用户。
现在我要么需要: 1.修改我的服务层方法以接受当前用户作为参数 要么 2.只需修改从http会话中获取当前用户的类即可。
我还需要创建一个审计日志,我将为此使用 Spring AOP。 Aspect 也需要访问“当前用户”。所以选项 #1 可能对我不起作用,我会选择 #2。
对于选项 #2,我将创建一个拦截器,将当前用户放入 ThreadLocal 变量中。新 REST 服务的控制器将执行相同的操作,然后在我的服务层和审计日志方面,我可以从那里获取当前用户。
我以前没有做过类似的事情,想知道是否有更好的方法。或者我应该期待这种方法会出现什么样的问题。
我会感谢任何 cmets 和想法。
盎司
这是我目前获取当前用户的方式:
@Override
public User getCurrentUser()
{
Authentication currentUser = getAuthentication();
return userService.getByLoginName(currentUser.getName());
}
protected Authentication getAuthentication()
{
return SecurityContextHolder.getContext().getAuthentication();
}
【问题讨论】:
-
一些代码可能会有所帮助。我了解到您正在从服务层访问 http 会话,对吗?
-
是的,我用示例更新了我的帖子。
-
很抱歉,但这并不能回答我的问题。我已经有一项服务可以从 http 会话中获取当前用户,并且我没有在任何其他地方直接调用 http 会话或 spring 上下文。问题是我不能再使用这种方法了,因为有了新的 REST 服务。
-
您应该将用户作为参数从您的控制器传递给您的服务方法。我看不出有什么问题
标签: java spring-mvc thread-local