【问题标题】:Session changed at each request in Java Servlet 3.0Java Servlet 3.0 中的每个请求都更改了会话
【发布时间】:2017-07-27 07:47:58
【问题描述】:

我们使用geronimo-servlet 3.0 和Tomcat 8 运行一个servlet,它将使用如下会话

@Service
public class SessionServiceImpl implements SessionService
{
    @Autowired(required = false)
    private HttpServletRequest  request;
    private HttpSession         session = null;

    @Override
    public void setUser(User user)
    {
        session = request.getSession();
        if (session != null)
        {
            session.setAttribute(SessionAttribute.user.name(), user);
        }
    }

    @Override
    public void setData(String data)
    {
        session = request.getSession();
        if (session != null)
        {
            session.setAttribute(SessionAttribute.data.name(), data);
        }
    }

    @Override
    public HttpSession getSession()
    {
        session = request.getSession();
        session.setAttribute("TimeoutBased", System.currentTimeMillis());
        return session;
    }
}

在其他服务中,例如AuthService,调用sessionService如下

public class AuthServiceImpl extends CustomizedServlet implements AuthService
{
    @Autowired
    private SessionService              sessionService;

    @Override
    public BaseModel login(BaseModel user) {
        ...
        sessionService.setUser(userEntity);
        ...
        sessionService.setData(data);
    }
}

CustomizedServlet 是 GWT 的 com.google.gwt.user.server.rpc.RemoteServiceServlet。登录方式是让网页客户端登录。这一切正常。

但是,有时,由于未知原因,每次从 Google Chrome 打开的 Web 客户端发送的请求都会更改会话。

此外,在调试模式下,我看到会话 ID 在一个请求中保持更改,如下图所示。

第一个请求响应如下

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: JSESSIONID=53144E2C46D6DF7C5986D56F01A6961E; Path=/ABC/; HttpOnly
Content-Encoding: gzip
Content-Disposition: attachment
Content-Type: application/json;charset=utf-8
Content-Length: 1909
Date: Tue, 07 Mar 2017 01:42:13 GMT

comet 的另一个 servlet 是第二个请求,请求中没有 jsessionid

GET /ABC/CometServlet?qndOeINh HTTP/1.1
Host: web.test.abc.com:8080
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36
Content-Type: application/x-javascript;
Accept: */*
Referer: http://web.test.abc.com:8080/ABC/
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-TW,zh;q=0.8,ja;q=0.6
Cookie: username=%7B%22state%22%3A%22s%3Aadmin%22%7D;

毕竟,如果我清除 chrome 的 网站数据,它仍然可以正常工作。还没有弄清楚这种情况的根本原因。有没有人有经验或想法?

【问题讨论】:

    标签: java session servlets sessionid jsessionid


    【解决方案1】:

    不知道这是否有帮助,但我也遇到了会话问题。 JSESSIONID 在每次请求时都会更改它的值。这只是由 JSF 标记引起的:

    <h:link outcome="${loguinBean.logOut()}" value="LogOut" />
    

    由于某种原因,当我成功登录并刷新页面时,会话会一直丢失。在我删除该标签并将其替换为 &lt;h:form&gt; 内的 &lt;h:commandLink&gt; 后,一切正常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-15
      • 1970-01-01
      • 2014-03-29
      • 1970-01-01
      • 1970-01-01
      • 2017-05-24
      • 2013-02-14
      • 2015-06-10
      相关资源
      最近更新 更多