我有文件上传Servlet的GWT应用程序。 GWT应用程序需要知道上传进度并使用GWT服务异步请求它。
首次上传文件时首次创建HttpSession对象。 在该前端请求使用GWT服务请求上载状态之后,该服务使用以下代码访问它:
public class ProgressServiceImpl extends RemoteServiceServlet implements ProgressService {
private static final long serialVersionUID = 1L;
@Override
public List<ProgressChangeEvent> getProgressEvents(String progressName) {
HttpSession session = getThreadLocalRequest().getSession(false);
System.out.println("Session in ProgressService: " + String.valueOf(session != null ? session.getId() : null));
return (session != null) ? Progress.getProgressEvents(session, progressName) : null;
}
}
在整个上传过程中,会话为空。 但是,下次我上传文件时会出现正确的会话。
如果我调用getSession(true),它第一次没有帮助,下次第一个对象刚丢失时,所以我认为在这种情况下getSession(false)是正确的调用方法,但是它没有不要同步会话很长一段时间。
这是一个错误还是一个理想的行为?如果它是按设计进行的,我该如何解决它以确保我总是以异步方式提供上传状态?
答案 0 :(得分:2)
这是解决了吗?我有同样的问题。没有人提供解决方案,问题是第一次在servlet getSession(true).getId(true)
和GWT getThreadLocalRequest().getRequestedSessionId()
中返回不同的ID,但下一次调用它们是同步的。
答案 1 :(得分:1)
GWT服务 是一个servlet。它的行为与任何其他servlet一样。
您的错误似乎在这一行:
HttpSession session = getThreadLocalRequest().getSession(false);
通过根据javadocs指定false
,您已经说过“如果会话尚未启动,请不要先启动会话,而是返回null”。相反,请指定true
表示您要启动会话。然后,应用程序发出的下一个请求将有一个会话,该会话是在此请求中进行的。
答案 2 :(得分:1)
如果在没有参数的情况下调用getSession
方法,则会出现以下行为:
Returns the current session associated with this request, or if the request does not have a session, creates one.
原则上它与调用getSession(true)
的行为相同。调用getSession(false)
永远不会创建您可以使用的会话。
答案 3 :(得分:1)
我在调用必须读取会话ID的servlet之前首先添加RPC调用。 RPC调用只是创建新会话,而调用servlet则在同一会话范围内发送。希望在旧项目中使用GWT帮助其他人。
答案 4 :(得分:1)
这是一个可能导致问题的独特情况。如果您的web.xml设置如下:
<session-config>
<cookie-config>
<secure>true</secure>
</cookie-config>
</session-config>
但是您没有在测试系统上使用https,GWT将为每个请求创建一个新会话,因为它没有获得保留会话所需的cookie。这样的事情不应该发生在生产环境中(或任何其他环境,如果设置正确的话),但我想我会提到它,因为我遇到过它,很难通过调试发现导致问题的原因。