从一个servlet发布到另一个servlet时无法维护会话

时间:2012-12-31 09:30:10

标签: java session servlets sessionid

我正在努力实现以下目标:

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但没有成功。

此外,我已尝试thisthis但未成功。感谢名单

编辑:解决方案This wonderful Post通过url传递它(它的SSL因此不会出现安全漏洞)

2 个答案:

答案 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转发,因为它是服务器转发,因此请求数据将继续用于下一个操作。

在重定向时,它会使服务器跳闸并且请求数据将丢失。