我开发了用于Web的gwt客户端应用程序,并且我使用了Google App Engine作为服务器,我用Java编写了服务器,并使用RequestBuilder将请求发送到服务器,如何在服务器和客户端之间同步Cookie。 客户端发送到服务器的每个请求服务器都会创建新会话,我想避免它
在服务器中,我在每个请求中都这样编写代码
private void addCookies(){
String jsessionId = request.getParameter("JSESSIONID");
if (jsessionId != null && !jsessionId.isEmpty()) {
Cookie userCookie = new Cookie("JSESSIONID", jsessionId);
response.addCookie(userCookie);
} else {
String sessionId = request.getSession().getId();
Cookie userCookie = new Cookie("JSESSIONID", sessionId);
response.addCookie(userCookie);
}
}
因此,对于第一个请求,我使用sessionId创建了cookie,并作为响应将会话id返回给客户端。
在客户端我写这样的代码
public void setSessionId(String sessionId) {
Cookies.setCookie(JSESSIONID, sessionId);
}
我从服务器获取sessionId并添加到cookie
当我使用RequestBuilder发送请求时会看到这样
public void sendRequest(final BaseRequest baseReuest){
long currentTime = getApplicationServices().getTimeManager().getCurrentDate().getTime();
if(isSessionIdle()){
getBaseClientFactory().restart(true);
return;
}
if(baseReuest.getOptionsRequest().isShowLoader()){
showLoader(true);
loaderRequestsCounter++;
}
try {
String url = baseUrl + baseReuest.getMethodName();
RequestBuilder requestBuilder = new RequestBuilder(RequestBuilder.POST, url);
requestBuilder.setHeader("Content-type", "application/x-www-form-urlencoded");
baseReuest.addParam(JSESSIONID, getSessionId());
requestBuilder.sendRequest(baseReuest.getParamsAsString(), new RequestCallback() {
@Override
public void onResponseReceived(Request request, Response response) {
requestFinish(baseReuest);
int status = response.getStatusCode();
if(status == 200){
String json = response.getText();
BaseRequestResponse baseRequestResponse = baseReuest.buildResponse(json);
if(!baseRequestResponse.isSuccess()){
showFailureMessage(baseRequestResponse.getFailureResponse());
}
baseReuest.notifyResponse(baseRequestResponse);
}
else{
onErrorResponse();
}
}
@Override
public void onError(Request request, Throwable exception) {
onErrorResponse();
}
private void onErrorResponse(){
requestFinish(baseReuest);
String message = getLabels().getLabel(IGeneralInfoLabels.THERE_IS_PROBLEM_ACCESSING_THE_SERVER);
if(!isOnline()){
message = getApplicationServices().getGeneralManager().getLocalLabel().connectionNotAvailable();
}
FailureResponse failureResponse = new FailureResponse(message);
showFailureMessage(failureResponse);
baseReuest.notifyFailureResponse(failureResponse);
}
private void showFailureMessage(FailureResponse failureResponse){
if(baseReuest.getOptionsRequest().isShowMessage()){
BaseRequestManager.this.showFailureMessage(failureResponse);
}
}
});
lastRequestSentTime = currentTime;
} catch (RequestException e) {
showLoader(false);
requestFinish(baseReuest);
}
}
例如,对于第一个请求,sessionId为jk7br57mo1e5,因此我将sessionId添加到客户端的cookie中,但是在每个请求中,服务器为何创建了新的sessionId? 谢谢