Session 配置两个cxf jaxrs客户端以使用相同的会话(cookies)
我想使用apachecxf通过jaxrs客户机连接到REST服务器。服务器有一个url进行身份验证,还有一些其他url进行实际操作。登录后,服务器创建一个会话并保持连接打开30分钟。我的问题是客户端不存储cookies,我总是在服务器上获得一个新的(未经验证的)会话 我在spring应用程序上下文中配置了客户端Session 配置两个cxf jaxrs客户端以使用相同的会话(cookies),session,rest,cookies,cxf,jax-rs,Session,Rest,Cookies,Cxf,Jax Rs,我想使用apachecxf通过jaxrs客户机连接到REST服务器。服务器有一个url进行身份验证,还有一些其他url进行实际操作。登录后,服务器创建一个会话并保持连接打开30分钟。我的问题是客户端不存储cookies,我总是在服务器上获得一个新的(未经验证的)会话 我在spring应用程序上下文中配置了客户端 <jaxrs:client id="loginResource" serviceClass="com.mycompany.rest.resources.LoginReso
<jaxrs:client id="loginResource"
serviceClass="com.mycompany.rest.resources.LoginResource"
address="${fsi.application.url}">
</jaxrs:client>
<jaxrs:client id="actionResource"
serviceClass="com.mycompany.rest.resources.ActionResource"
address="${fsi.application.url}">
</jaxrs:client>
如何将两个客户端配置为使用同一会话或在客户端之间共享会话cookie?我一直在努力解决同一问题,最后才找到解决方案 1) 让客户端保留cookie
WebClient.getConfig(proxy).getRequestContext().put(
org.apache.cxf.message.Message.MAINTAIN_SESSION, Boolean.TRUE);
也许有一种方法可以通过配置和编程实现上述功能
2) 将cookies从一个客户端复制到另一个客户端
public static void copyCookies(Object sourceProxy, Object targetProxy) {
HTTPConduit sourceConduit = WebClient.getConfig(sourceProxy).getHttpConduit();
HTTPConduit targetConduit = WebClient.getConfig(targetProxy).getHttpConduit();
targetConduit.getCookies().putAll(sourceConduit.getCookies());
}
使用代理A进行身份验证后,我调用上述方法与代理B共享其cookie,代理B执行实际工作。我使用以下请求/响应筛选器在每个请求中传递会话id: ClientResponseFilter>用于从会话cookie提取会话id
ClientRequestFilter>在每个请求中将会话id作为cookie头传递
带会话的REST服务器??这怎么可能呢?我们实现的是客户机而不是服务器。我们知道REST应该是无状态的,不使用会话,但不幸的是,我们无法更改服务器。
private class SessionIdRequestFilter implements ClientRequestFilter, ClientResponseFilter {
/** cookie header key */
private static final String COOKIE_KEY = "Cookie"; //$NON-NLS-1$
/** name of the session cookie */
private String cookieName = "JSESSIONID";
/** holds the session id from the cookie */
private String sessionId;
@Override
public void filter(ClientRequestContext request) throws IOException {
// append session cookie to request header
if (!request.getHeaders().containsKey(COOKIE_KEY) && sessionId != null) {
request.getHeaders().add(COOKIE_KEY, getCookieName() + "=" + sessionId); //$NON-NLS-1$
}
}
@Override
public void filter(ClientRequestContext request, ClientResponseContext response) throws IOException {
// find sessionId only if not already set
if (sessionId == null) {
Map<String, NewCookie> cookies = response.getCookies();
if (cookies != null && !cookies.isEmpty()) {
NewCookie cookie = cookies.get(getCookieName());
if (cookie != null) {
sessionId = cookie.getValue();
}
}
}
}
private String getCookieName() {
return cookieName;
}
}
RestClientBuilder.newBuilder().baseUri(apiUri).register(new SessionIdRequestFilter());