Java Servlet和GWT服务在第一次请求时不共享会话

时间:2013-11-19 22:11:24

标签: java session gwt servlets

我有文件上传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)是正确的调用方法,但是它没有不要同步会话很长一段时间。

这是一个错误还是一个理想的行为?如果它是按设计进行的,我该如何解决它以确保我总是以异步方式提供上传状态?

5 个答案:

答案 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。这样的事情不应该发生在生产环境中(或任何其他环境,如果设置正确的话),但我想我会提到它,因为我遇到过它,很难通过调试发现导致问题的原因。