Java 保持;“当前用户”;在本地
我有一个SpringMVC应用程序,目前有两个通道——web应用程序和REST服务。两者都有用户的http会话,我可以很容易地在我的服务类中获取“当前用户” 现在我需要开发另一个REST服务,其中没有http会话,当前用户依赖于请求参数。因此,控制器将读取该请求参数并找到当前用户 现在我需要: 1.修改我的服务层方法以接受当前用户作为参数 或 2.只需修改从http会话获取当前用户的类 我还需要创建审计日志,我将使用SpringAOP来实现这一点。该方面也需要访问“当前用户”。所以选项1可能对我不起作用,我会选择选项2 对于选项2,我将创建一个拦截器,将当前用户放入一个ThreadLocal变量中。新REST服务的控制器将执行相同的操作,然后在我的服务层和审计日志方面,我可以从那里获取当前用户 我以前从未做过类似的事情,我想知道是否有更好的方法。或者这种方法会带来什么样的问题 如有任何意见和想法,我将不胜感激 奥兹 以下是我当前获取当前用户的方式:Java 保持;“当前用户”;在本地,java,spring-mvc,thread-local,Java,Spring Mvc,Thread Local,我有一个SpringMVC应用程序,目前有两个通道——web应用程序和REST服务。两者都有用户的http会话,我可以很容易地在我的服务类中获取“当前用户” 现在我需要开发另一个REST服务,其中没有http会话,当前用户依赖于请求参数。因此,控制器将读取该请求参数并找到当前用户 现在我需要: 1.修改我的服务层方法以接受当前用户作为参数 或 2.只需修改从http会话获取当前用户的类 我还需要创建审计日志,我将使用SpringAOP来实现这一点。该方面也需要访问“当前用户”。所以选项1可能对我
@Override
public User getCurrentUser()
{
Authentication currentUser = getAuthentication();
return userService.getByLoginName(currentUser.getName());
}
protected Authentication getAuthentication()
{
return SecurityContextHolder.getContext().getAuthentication();
}
我认为一个简单的方法是为新的REST Web服务配置一个servlet过滤器,用请求参数生成的
身份验证对象填充SecurityContextHolder
您可以阅读以下内容:了解更多详细信息
使用此解决方案,您不需要修改代码来检索当前用户。(请注意,SecurityContextHolder
已经在使用ThreadLocal
来存储SecurityContext
,因此身份验证
)一些代码可能会有所帮助。我知道您正在从服务层访问http会话,对吗?是的,我用一个示例更新了我的帖子。很抱歉,这没有回答我的问题。我已经有了一个从http会话获取当前用户的服务,并且我没有在任何其他地方直接调用http会话或spring上下文。问题是,由于新的REST服务,我不能再使用这种方法了。您应该将用户作为参数从控制器传递给您的服务方法。我看不出有什么问题谢谢!这其实是最简单的方法。我可以直接在REST控制器中设置身份验证对象,而不是使用过滤器,因为请求是XML格式的,需要额外的转换。