【发布时间】:2013-02-12 08:31:44
【问题描述】:
客户端
我有一个使用基本 POST 或 GET 方法连接到远程服务器的 java 应用程序:
URL url = new URL(urlStr);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setAllowUserInteraction(false);
conn.setRequestProperty("Content-type", "text/xml; charset=" + ENCODING);
conn.connect();
conn.getOutputStream().write(data.getBytes(ENCODING));
conn.getOutputStream().close();
(我无法更改此代码,唯一可以更改的是调用方法时发送到服务器的urlStr 和data。
[EDIT] :客户端可以是 java 客户端或任何其他客户端(c++、objective-c、..)。这里的重点是,我只能访问帖子正文中的内容以及 URL。
服务器端
在我的服务器端,我想实现 Spring Security(SecurityContext 和会话持久性)。
我知道 Spring Security 是基于浏览器的 cookie,当它是一个 WebApp 来保存有关 session id 的信息。但就我而言,没有浏览器。
是否需要模拟
JSESSIONID的存储并将其发送回服务器?我不确定这是否可行,因为我需要致电conn.addRequestProperty(key, value)这是不可能的。还有其他办法吗?
谢谢。
[编辑]
正如@zagyi 所指出的,我可以使用 URL 将会话令牌传递给 Spring,但我仍然不知道如何。
【问题讨论】:
-
您必须能够传递一些信息,根据这些信息请求在服务器端进行身份验证。如果它不是 cookie,它可能是一个基本的 auth 标头,但从您的角度来看,这与 cookie 没有太大区别......
-
所以你建议我向我的客户端发送一个令牌,每当它向服务器发出请求时都会发送该令牌(如 JSESSIONID 令牌)。但是如何从服务器端生成这个令牌,以及如何根据存储的会话检查它?
-
选项1是在成功登录后将JSESSIONID存储在客户端上,并在每次请求时将该表单客户端重新发送到服务器。选项 2 是客户端在 auth 标头中为每个请求发送凭据,然后不需要进行会话处理。
-
感谢您的回复。选项 1:我从哪里获得服务器上的 JSESSIONID,并且拥有 JSESSIONID 如何获得相应的会话?选项 2:对于每个身份验证,我需要检查数据库,因此检查每个请求都会消耗大量资源。
-
您可以在 url 中从客户端传递会话 id,然后您的 servlet 容器对其进行处理,并使会话可用于您的 webapp。 Spring Security 组件将通过 http 请求对象访问会话。但这都是实现的,只需要正确配置即可。
标签: java spring session spring-security session-cookies