Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/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 如何从无状态会话bean获取JSF应用程序用户名_Java_Jpa_Proxy - Fatal编程技术网

Java 如何从无状态会话bean获取JSF应用程序用户名

Java 如何从无状态会话bean获取JSF应用程序用户名,java,jpa,proxy,Java,Jpa,Proxy,在我们的应用程序中,我们使用JSF和EJB3.0(EclipseLink 2.0)。我们需要对无状态会话bean中的每个连接使用Oracle代理授权。为此,我们需要获得DB用户名以通过代理进行连接。DB username是由JSF认证的username按照规则构造的 这是一篇关于这个主题的文章 因此,当一个经过身份验证的用户调用一个JSF托管bean方法,而该方法又调用某个会话bean方法时,他的用户名必须以某种方式传递给会话bean 现在我有两个不太好的解决方案: -在每个会话bean方法中将

在我们的应用程序中,我们使用JSF和EJB3.0(EclipseLink 2.0)。我们需要对无状态会话bean中的每个连接使用Oracle代理授权。为此,我们需要获得DB用户名以通过代理进行连接。DB username是由JSF认证的username按照规则构造的

这是一篇关于这个主题的文章

因此,当一个经过身份验证的用户调用一个JSF托管bean方法,而该方法又调用某个会话bean方法时,他的用户名必须以某种方式传递给会话bean

现在我有两个不太好的解决方案: -在每个会话bean方法中将username作为参数传递(不是很整洁,但可以工作); -上面文章的解决方案是:使用会话bean的类成员变量来存储用户名(不是线程安全的,而且有潜在的危险)

另外,我找到了使用线程局部变量的解决方案:_http://www.adam-bien.com/roller/abien/entry/how_to_pass_context_with
它工作正常,但仍然存在一个问题。在每次调用ejb会话bean之前,我需要将当前用户名放在每个jsf会话管理bean中,因为它必须在同一个线程中。

如果您的用户通过容器进行身份验证,您可以使用注入的
javax.ejb.SessionContext
实例访问ejb中的用户名,如下所示:

@Resource
private SessionContext context;

private String getCurrentUsername() {
    return context.getCallerPrincipal().getName();
}
编辑:如果通过登录配置和安全约束元素在web.xml中配置了身份验证,则此操作有效。如果您自己进行身份验证,则可以使用ServletFilter和HttpServletRequestWrapper覆盖getUserPrincipal、getRemoteUser和isUserInRole(在glassfish中测试)


如果在JSFbean中处理身份验证,那么这可能不起作用,因为ejb已经初始化并注入。但是,您也可以创建一个会话范围的ejb,它只保存用户名,并将这个bean注入到您的无状态bean中。

非常感谢,Jörn。在我看来,你的解决办法很巧妙。另外,你能告诉我SessionContext什么时候不包含当前的web层用户名吗?