保護された Glassfish 3.1.2 に非常に厄介な問題があります。スタンドアロン クライアントから 2 人 (またはそれ以上) のユーザーを接続すると、EJB から呼び出し元のプリンシパルを取得しようとすると、常に最後に接続されたユーザーが表示されます。
sessionContext.getCallerPrincipal().getName();
この問題について教えてください。
これが私のクライアントです:
<pre>
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
connectUser("userA", "pwdB");
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
connectUser("userB", "pwdB");
}
}).start();
}
public static void connectUser(String userName, String password) {
try {
ProgrammaticLogin login = new ProgrammaticLogin();
login.login(userName, password.toCharArray());
Context context = new InitialContext();
MyServiceRemote myService = (MyServiceRemote) context.lookup("MyService");
String remoteCaller = myService.getUserName();
System.out.println("Local is (" + userName + "), Remote is (" + remoteCaller + ")");
} catch (Exception e) {
e.printStackTrace();
}
}
</pre>
これが私のEJBです:
<pre>
@Stateless(mappedName = "MyService", name="MyServiceBean")
public class MyServiceBean implements MyServiceRemote{
@Resource
private SessionContext sessionContext;
public MyServiceBean () {
super();
}
public String getUserName() {
return sessionContext.getCallerPrincipal().getName();
}
}
</pre>