Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.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 Spring安全注销和独立应用程序_Java_Spring Security_Logout - Fatal编程技术网

Java Spring安全注销和独立应用程序

Java Spring安全注销和独立应用程序,java,spring-security,logout,Java,Spring Security,Logout,我有一个SOAP web服务,它使用基本身份验证通过Spring安全性进行保护 我已经编写了一个Swing应用程序来访问这个web服务。当应用程序启动时,会出现一个登录对话框,用户在其中输入其凭据。当用户单击登录按钮时,将使用给定的凭据创建JAXWS客户端。我还想给登录用户注销的可能性。Spring Security需要访问URL才能注销。这在独立应用程序中是如何工作的?这应该通过CXF还是使用简单的HTTP客户端来实现?如何实现这一点无关紧要。唯一的要求是创建HTTP GET to logou

我有一个SOAP web服务,它使用基本身份验证通过Spring安全性进行保护


我已经编写了一个Swing应用程序来访问这个web服务。当应用程序启动时,会出现一个登录对话框,用户在其中输入其凭据。当用户单击登录按钮时,将使用给定的凭据创建JAXWS客户端。我还想给登录用户注销的可能性。Spring Security需要访问URL才能注销。这在独立应用程序中是如何工作的?这应该通过CXF还是使用简单的HTTP客户端来实现?

如何实现这一点无关紧要。唯一的要求是创建HTTP GET to logout URL,但您的请求应该包含会话的会话ID。否则Spring无法知道要使哪个会话无效。因此,我认为最简单的方法是使用当前使用的同一个客户端。

完全避免会话,并让您的JAXClient在每个conn请求上重新验证。使用Spring Security 3.1提供的无状态配置secuity.xml。

好的,我不想讨论有状态与无状态。如果您需要从Swing应用程序注销,只需向配置的注销URL发送HTTP GET请求,同时发送会话ID。您甚至不需要Apache HttpClient:

String url = "http://example.com/logout";
String charset = "UTF-8";
String session = ";jsessionid=" + sessionId;
URLConnection connection = new URL(url + session).openConnection();
connection.setRequestProperty("Accept-Charset", charset);
InputStream response = connection.getInputStream();
// ...
有关详细信息,请参阅(触发HTTP GET请求)

您可以将会话ID直接附加到URL,如上图所示,也可以将其作为常规cookie头发送,如下所示:

connection.addRequestProperty("Cookie", "JSESSIONID=" + sessionId);

谢谢你的回答。我正在使用JaxWsProxyFactoryBean创建用于调用web服务方法的代理。是否有可能通过代理获取注销URL?@Mickelmarrache,你确定JAX客户端将缓存会话cookie吗?@Michael-O我认为JAX客户端将缓存JSESSIONID cookie,因为这是我从登录到注销使用的客户端。此外,我还将BindingProvider.SESSION\u Maintenance\u属性设置为true。很明显,当它是无状态的时,这会更容易,但我想限制每个用户一个连接的应用程序实例(使用Spring Security的并发控制功能,但此功能仅在服务维护会话时才相关)。我会考虑这种可能性。您知道如何配置客户端以对每个请求进行重新身份验证吗?然后限制同一主机上已启动的Swing客户端的数量。@MarcelStör问题不同。例如,如果一个用户与另一个用户共享其凭据。每个用户都可以使用相同的凭据在其主机上运行客户端实例。这就是我想要避免的。@Mickelmarrache,首先你应该知道SOAP不知道任何HTTP会话。它仅将HTTP用作传输。你不应该依赖任何课程。如果你想限制连接的数量,也许你应该考虑Spring SEC或Tomcat中的一个过滤器。您不需要重新配置客户端。创建一个JAXWS客户端实例,配置并重用它,直到Swing应用程序关闭。@Michael-O我不使用HTTP会话没有任何问题。问题是,我猜Spring安全性依赖HTTP会话来限制并发连接的数量,这就是为什么我被迫使用HTTP会话的原因。如果您知道另一个解决方案,请与我们分享。感谢您的回答,这是我正在寻找的,但会话ID作为cookie发送,我可以从CXF的HttpConductor获得,但我没有看到会话ID作为查询参数发送。它不是查询字符串参数(抱歉,更正了我的代码)但对于不支持cookie的用户代理,有一种特殊的机制,例如,如果您在浏览器中禁用cookie。有关详细信息,请参见例如。但是,我添加了关于如何设置会话ID cookie的说明。