我们有一个使用Acegi安全性的JSF Web应用程序。我们还有一个独立的Java Swing应用程序。 Swing应用程序的一项功能是在浏览器窗口中加载用户的主页。
为此,我们当前使用Commons HttpClient通过Web应用程序对用户进行身份验证:
String url = "http://someUrl/j_acegi_security_check";
HttpClient client = new HttpClient();
System.setProperty(trustStoreType, "Windows-ROOT");
PostMethod method = new PostMethod(url);
method.addParameter("j_username", "USERNAME");
method.addParameter("j_password", "PASSWORD");
int statusCode = client.executeMethod(method);
if (statusCode == HttpStatus.SC_MOVED_TEMPORARILY ) {
Header locationHeader= method.getResponseHeader("Location");
String redirectUrl = locationHeader.getValue();
BrowserLauncher launcher = new BrowserLauncher();
launcher.openURLinBrowser(redirectUrl);
}
这将返回HTTP 302重定向响应,我们从中获取重定向URL并使用BrowserLauncher 2将其打开。该URL包含新的会话ID,例如:
http://someUrl/HomePage.jsf;jsessionid=C4FB2F643CE48AC2DE4A8A4C354033D4
我们看到的问题是Acegi处理重定向,但抛出AuthenticationCredentialsNotFoundException。似乎由于某种原因,无法在安全上下文中找到经过身份验证的凭据。
有谁知道为什么会这样吗?如果有人需要更多信息,那么我很乐意为您服务。
非常感谢,
理查德
最佳答案
我从未做过Acegi / SpringSecurity,但是症状很明显:请求中缺少一些重要信息。如果没有新内容需要在后续请求的标头中传递回去,则至少需要调查所有响应标头。也许是另一个代表Acegi凭据的cookie条目。
但另一个警告是,实际上您不能仅在本地浏览器实例中打开URL,因为无法通过它传递必要的请求标头。您需要让Swing应用程序充当内置的Web浏览器。例如。在InputStream
中获取HTML响应,并在Swing框架中以某种方式呈现/显示它。我将检查是否还没有针对该API的现有API,因为它将涉及比您最初认为的更多的工作。