0

我正在尝试归档以下内容:

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();

全部返回假。我尝试使用如上所示的 cookie 机制发送会话 id,并尝试从 url发送接收到的会话 id,但没有成功。

另外,我试过这个这个没有成功。谢谢

编辑:解决方案这个精彩的帖子通过 url 传递它(它的 SSL,所以它不会是安全漏洞)

4

2 回答 2

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。希望这对其他人有帮助...

于 2013-01-02T13:41:14.897 回答
0

最好使用 HTTP 转发,因为它是服务器转发,因此请求数据将被转发到下一个操作。

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

于 2012-12-31T14:41:19.497 回答