【发布时间】: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 设计是无状态的。为什么需要饼干? :-)