我有一个谷歌应用引擎(Java)项目,我尝试使用会话。在我的appengine-web.xml文件中我有
<sessions-enabled>true</sessions-enabled>
。然后我有一个UserEndpoint类,它有一个名为&#34; login&#34;的API方法。如果尝试登录我的应用的用户是合法的,我会在我的方法中创建这样的会话:
HttpSession session = req.getSession();
session.setAttribute("userId", new LongBean(user.getId().longValue()));
LongBean对象是可序列化的,如下所示:
public class LongBean implements Serializable {
private static final long serialVersionUID = 8041280664162299553L;
private long longValue;
public LongBean(long longValue) {
this.longValue = longValue;
}
public long getLongValue() {
return longValue;
}
public void setLongValue(long longValue) {
this.longValue = longValue;
}
}
。现在,我的端点中有另一个名为insertScore的API方法。在那里,我检查会话是否为空并且具有正确的&#34; userId&#34;属性。该方法的签名是:
public UserScore insertScore(
HttpServletRequest req,
Score score) throws NotFoundException, ForbiddenException
然后我做
Object userId = req.getSession().getAttribute("userId");
。我的问题是,当项目部署在谷歌的服务器上时,userId对象为null。更令人气愤的是它在当地完美运作。我已经搜索了stackoverflow以查找我的问题,我发现的唯一答案是会话必须是可序列化的,但我的LongBean对象是可序的!任何人都可以解释为什么它在我的本地主机上工作但不在我的服务器上工作吗?
编辑:额外信息:我可以在数据存储区查看器中看到会话已创建并插入到我的数据存储区中的_ah_SESSION表中。
答案 0 :(得分:0)
添加
auth = @ApiAuth(allowCookieAuth = AnnotationBoolean.TRUE)
到我的端点中的@API注释允许通过网络发送JSESSIONID cookie,从而解决了我的问题。