W aplikacji desktopowej, próbuje wykorzystać SwingWorker, aby pobierać dane (EJB) od JBossa, ale o ile działało mi wszystko ładnie pod Ubuntu to już pod Win XP rzuca EJBAccessException: Caller unauthorized, a co jeszcze dziwniejsze pod Win 7 wyjątek ten rzuca mi raz na 10 połączeń. Poradźcie coś bo już mi ręce opadają.
W wielkim uproszczeniu mam taką konstrukcję:
LoginDialog.java:
//...
private void login() {
Session session = new Session(username, password); //login i hasło z TextField
Client.getInstance.setSession(session);
//kod jest uproszczony w praktyce obsługuję w ten sposób pasek postępu
SwingWorker<Manager, Integer> worker = new SwingWorker<Manager, Integer>() {
protected Manager doInBackground() throws Exception {
//tutaj rzuca wspomniany wyjątek czyli rozumiem że wątek nie ma dostępu do LoginContextu?
return Client.getInstance().getSession().getManager();
}
};
worker.execute();
Manager manager = managerWorker.get();
//jak pominę SwingWorkera to działa poprawnie
}
//...
Session.java:
public class Session {
private LoginContext lc;
private Context ic;
public Session(String username, String password) {
System.setProperty( "java.security.manager", "" );
System.setProperty( "java.security.policy", Session.class.getResource( "/client.policy" ).toString() );
System.setProperty( "java.security.auth.login.config", Session.class.getResource( "/auth.conf" ).toString() );
AuthCallbackHandler handler = new AuthCallbackHandler(username, password.toCharArray());
lc = new LoginContext("company", handler);
lc.login();
Properties p = new Properties();
p.put(Context.INITIAL_CONTEXT_FACTORY, System.getProperty(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory"));
p.put(Context.PROVIDER_URL, System.getProperty(Context.PROVIDER_URL, "jnp://localhost:1099"));
p.put(Context.URL_PKG_PREFIXES, System.getProperty(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces"));
ic = new InitialContext(p);
}
public Manager getManager() throws RemoteException {
try {
ManagerBeanRemote managerBean = (ManagerBeanRemote) ic.lookup("Company/ManagerBean/remote");
return managerBean.getManager();
} catch (NamingException ex) {
throw new RemoteException(ex.getMessage(), ex);
}
}
}
Client.java:
przechowuje session aby był do niej dostęp statycznie z każdej klasy
client.policy:
grant {
permission java.security.AllPermission;
};
auth.conf:
company {
org.jboss.security.ClientLoginModule required;
};