【问题标题】:JAX-RS, RestEasy: No session cookieJAX-RS,RestEasy:没有会话 cookie
【发布时间】:2012-02-03 00:50:01
【问题描述】:

伙计们,

以前当你点击一个 servlet/jsp 时,应用服务器会自动启动一个会话。它将在第一个动态响应中放置一个会话 cookie,该响应将在整个过程中被跟踪。

我有一个休息后端,我注意到没有会话 cookie 被交易。所以我手动添加代码来发送 JSESSIONID cookie:

@Context 
private HttpServletRequest httpRequest;
// ...
@GET
@Path( "/{rcpGuid}" )
public Response myMethod( ... )
{
    final HttpSession session = httpRequest.getSession();
    final String sSessionId = session.getId();
    ...
    return Response.status( Response.Status.SEE_OTHER ).
        location( redirectUrl ).cookie( new NewCookie( "JSESSIONID", sSessionId ) );
}

现在这导致 JSESSIONID cookie 的 2 个副本被返回,而之前没有 Set-Cookie 标头。这是我现在在浏览器的检查器中看到的:

Set-Cookie:JSESSIONID=sdm-Q1P6pRoQbKd4-9cJylGb; Path=/nn, JSESSIONID=sdm-Q1P6pRoQbKd4-9cJylGb; Version=1

只要这行得通,我不在乎。但不幸的是,当我的浏览器请求重定向到的 URL(请注意响应是“SEE_OTHER”)时,该请求不包含会话 ID。这导致我的应用无法正常运行。

有什么见解吗?

【问题讨论】:

  • 你的客户端框架是什么?客户端可能会忽略/拒绝您的服务器发送的会话 ID。我只提到这一点是因为我使用 Jersey 客户端 API,并且它在底层使用 Java 的 cookie 机制,它拒绝所有开箱即用的 cookie。
  • REST 设计是无状态的。为什么需要饼干? :-)

标签: jax-rs resteasy jboss7.x


【解决方案1】:

以前当你点击一个 servlet/jsp 时,应用服务器会自动启动一个会话。它会在第一个动态响应中放置一个会话 cookie,并在整个过程中进行跟踪。

在调用httpRequest.getSession() 之前,应用服务器不会创建会话。

我有一个休息后端,我注意到没有会话 cookie 被交易。所以我手动添加代码来发送 JSESSIONID cookie:

在您的示例中,您调用 getSession() 并创建一个单独的 jsessionid cookie。这可以解释为什么你有两个 cookie。如果你都不做,你根本就没有jessionid

【讨论】:

    【解决方案2】:

    如果它是 REST 后端,那么您不应该有 JSESSIONID cookie 并将您的后端端点保持为无状态。

    从您的网络服务中获取结果所需的所有信息都应包含在对网络服务的请求中。 Web 服务是幂等的。

    【讨论】:

      猜你喜欢
      • 2014-02-03
      • 1970-01-01
      • 2011-07-22
      • 2020-09-08
      • 2012-02-12
      • 1970-01-01
      • 1970-01-01
      • 2018-12-08
      • 2016-07-06
      相关资源
      最近更新 更多