我正在努力实现以下目标:
1)最终用户将发布到servlet(让我们称之为GW) - GW将存储他的会话以满足以下请求。
2)对于GW收到的每个请求,GW将发布到另一个servlet(将其称为API)
3)只有GW可以发布到API(SSL安全),并且两者都有固定的IP(尽管它与此问题无关)
4)对于发布到API的每个请求,API还必须为将来的请求维护会话。
5)GW使用以下实现发布到API:
try {
HttpPost httppost = new HttpPost(uri);
CookieStore cookieStore = new BasicCookieStore();
HttpContext httpContext = new BasicHttpContext();
httpContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);
HttpResponse response = httpclient.execute(httppost, httpContext);
} finally {
httpclient.getConnectionManager().shutdown();
}
6)API将收到如下请求:
public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession(false);
// isSessionValidFromURL = req.isRequestedSessionIdFromURL();
// isSessionValidFromCookie = req.isRequestedSessionIdFromCookie();
isSessionValid = req.isRequestedSessionIdValid();
if (isSessionValid) {
...
...
}
...
}
7)在API中,如果请求是新请求,它将创建一个新会话,将参数存储在DB中并构建全局变量等等。
问题是:登录后(GW发送登录到API)命令发送后,API创建新会话到目前为止还不错。在第二个命令上,它无法在以下代码行上验证会话:isSessionValid = req.isRequestedSessionIdValid();
isSessionValidFromURL = req.isRequestedSessionIdFromURL();
isSessionValidFromCookie = req.isRequestedSessionIdFromCookie();
all返回false。我尝试使用cookie机制发送会话ID,如上所示,并尝试发送收到的会话ID from the url但没有成功。
编辑:解决方案:This wonderful Post通过url传递它(它的SSL因此不会出现安全漏洞)
答案 0 :(得分:1)
此问题的一个解决方案是:
...
...
httpclient.setHttpRequestRetryHandler(myRetryHandler);
uri = AppInit.fieldProxyURI + ";jsessionid=" + sessionInfo.getAttribute(GatewayConstants.PROXYSESSIONID);
HttpPost httppost = new HttpPost(uri);
nvps =(List<NameValuePair>) sessionInfo.getAttribute(GatewayConstants.PROXY_QUERY_PARAMS);
httppost.setEntity(new UrlEncodedFormEntity(nvps, Consts.UTF_8));
ProxyPoster thread = new ProxyPoster(httpclient,httppost,sessionInfo,localContext);
thread.start();
thread.join();
} finally {
// leave the connection resource open
}
static class ProxyPoster extends Thread {
//fields here..
// constructor here...
@Override
public void run() {
try {
HttpResponse response = httpClient.execute(httppost, context);
// proccess response
} catch (Exception e) {
httppost.abort();
}
}
通过这种方式维护会话,保持httpclient连接打开并通过URL发布收到的会话ID。 希望这会有助于其他人......
答案 1 :(得分:0)
最好使用HTTP转发,因为它是服务器转发,因此请求数据将继续用于下一个操作。
在重定向时,它会使服务器跳闸并且请求数据将丢失。