Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 保持;“当前用户”;在本地_Java_Spring Mvc_Thread Local - Fatal编程技术网

Java 保持;“当前用户”;在本地

Java 保持;“当前用户”;在本地,java,spring-mvc,thread-local,Java,Spring Mvc,Thread Local,我有一个SpringMVC应用程序,目前有两个通道——web应用程序和REST服务。两者都有用户的http会话,我可以很容易地在我的服务类中获取“当前用户” 现在我需要开发另一个REST服务,其中没有http会话,当前用户依赖于请求参数。因此,控制器将读取该请求参数并找到当前用户 现在我需要: 1.修改我的服务层方法以接受当前用户作为参数 或 2.只需修改从http会话获取当前用户的类 我还需要创建审计日志,我将使用SpringAOP来实现这一点。该方面也需要访问“当前用户”。所以选项1可能对我

我有一个SpringMVC应用程序,目前有两个通道——web应用程序和REST服务。两者都有用户的http会话,我可以很容易地在我的服务类中获取“当前用户”

现在我需要开发另一个REST服务,其中没有http会话,当前用户依赖于请求参数。因此,控制器将读取该请求参数并找到当前用户

现在我需要: 1.修改我的服务层方法以接受当前用户作为参数 或 2.只需修改从http会话获取当前用户的类

我还需要创建审计日志,我将使用SpringAOP来实现这一点。该方面也需要访问“当前用户”。所以选项1可能对我不起作用,我会选择选项2

对于选项2,我将创建一个拦截器,将当前用户放入一个ThreadLocal变量中。新REST服务的控制器将执行相同的操作,然后在我的服务层和审计日志方面,我可以从那里获取当前用户

我以前从未做过类似的事情,我想知道是否有更好的方法。或者这种方法会带来什么样的问题

如有任何意见和想法,我将不胜感激

奥兹

以下是我当前获取当前用户的方式:

@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格式的,需要额外的转换。