【发布时间】:2015-03-16 19:50:48
【问题描述】:
我有一个 GAE CloudEndpoints 项目,但我无法使用 Java 会话来维护会话状态。这是我到目前为止所做的:
首先我在 appengine-web.xml 文件中启用了会话。
然后我创建了一个“登录对象”来保存用户邮箱和密码。我还让它可序列化(当我读到这是一个要求?)
@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Session implements Serializable{
private static final long serialVersionUID = 4013168535563327001L;
@Persistent
String email;
@Persistent
String password;
public String getemail() {
return email;
}
public void setemail(String email) {
this.email = email;
}
public String getpassword() {
return password;
}
public void setpassword(String password) {
this.password = password;
}
}
然后我创建了一个控制器来创建会话并将登录对象作为属性存储在其中:
@ApiMethod(name="setLoginTest")
public Object setloginTest(HttpServletRequest request, User myLogin){
//Just setting some values into myLogin
//for production, this will compare submitted values against a DB.
myLogin.email = "Jason";
myLogin.password = "123";
//Creating the session object
HttpSession mySession = request.getSession(true);
//Trying to set an attribute that holds the login object
//(i.e. i want to store the username in the session)
mySession.setAttribute("loginObj", myLogin);
return myLogin;
}
如果我调用这个端点,系统返回 myLogin 对象没有问题,我知道 mylogin 对象有用户名“jason”和密码“123”
所以,如果让我创建检查会话是否有一些用户数据或 null 的端点,那么最后一步是。理想情况下,如果已登录,我会采取一些措施,如果未登录,则返回“未登录”消息。
@ApiMethod(name="getSessionTest")
public Object getSessionTest(HttpServletRequest request, User myLogin){
//getting the current session info
HttpSession mySession = request.getSession(false);
//Always returns NULL which is not right!!
return mySession.getAttribute("loginObj");
}
然而,问题在于“Getsessiontest”端点总是返回空值。请帮忙!
【问题讨论】:
-
你知道为什么上面的代码返回null吗?我在 StackOverflow 上搜索了 GAE 和 CloudEndpoints 中 Java Session 的一个很好的例子,但是大多数人只推荐使用 Google 帐户系统(这不是这个项目的选项)
-
根据 m1k3t 链接的答案,您永远不能为会话设置客户端 cookie,因此请求的会话始终为空。如果您不想使用 Google 帐户,则传递 User 对象在您的情况下也不好。一种替代方法是通过手动将会话 ID 作为命名参数传递给 API 方法来滚动您自己的会话。
-
您能否确认会话是否保留在 memcache/datastore 上?
标签: java google-app-engine session google-cloud-endpoints