【问题标题】:GAE CloudEndpoints Java SessionsGAE CloudEndpoints Java 会话
【发布时间】: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


【解决方案1】:

如果您正在运行 Cloud Endpoints,为什么还需要服务器端的会话?您可以在客户端存储“会话”信息。如果您从 Javascript 客户端使用端点,则可以使用 localstorage 来充当会话 cookie。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-27
    • 1970-01-01
    • 1970-01-01
    • 2011-07-25
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    • 2014-10-03
    相关资源
    最近更新 更多