如何处理 Google App Engine 中的会话?

How to deal with Sessions in Google App Engine?

我在 servlet 中成功创建了会话,我可以将会话/会话属性获取到 jsp,但不能在端点 class 中获取。我想在端点 classes 中获取会话信息。请帮我解决这个问题。

我在 eclipse 中使用 maven 并在 appengine 中启用了会话-web.xml

我也读了一篇 article 关于这个的文章,除了如何启用会话我什么都不懂。

这个 servlet 是用来检查是否已经有一个会话

public class FirstServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public FirstServlet () {
    super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    service(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    service(request, response);
}
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setContentType("text/html");
    HttpSession session=request.getSession(false);
    if (session != null) {
        String name = session.getAttribute("name");
        // do something
    } else {
        // do something
    }

}
}

如果会话不存在,则使用此 servlet 创建会话

public class SeccondServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public SeccondServlet() {
    super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    service(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    service(request, response);
}

@Override

protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    response.setContentType("text/html");
    request.getRequestDispatcher("login.html").include(request, response);  
    String name = request.getParameter("name"); 
    HttpSession session=request.getSession();
    session.setAttribute("name", name);
    // do something 
}
}

这是我的端点 api class(Google 云端点)

@Api(
    name = "myapi",
    version = "v1",
    clientIds = "given client ids")
public class MyApi{
    @ApiMethod(name = "name", path = "name", httpMethod = "post")
    public List<String> getUser( HttpServletRequest servletReq) {
        HttpSession session = servletReq.getSession(false);
        List<String> name= new ArrayList<String>();
        if(session == null) {
            userName.add("no Name");
        } else {
            name.add((String)session.getAttribute("name"));
        }

       return name;
    }

我仍然得到 "no Name" 作为结果,即使我创建了会话并且我可以获得会话属性,这里 "name"

假设您了解 HttpSessions(如果不知道,它只是服务器和客户端之间为了处理登录用户而交换的 cookie)。

因此所有与用户相关或任何其他与会话相关的信息都存储在服务器端,代表该信息的会话 ID 将作为 cookie 发送给客户端,客户端将在每次 HTTP 请求时将其发回。

AppEngine 使用 Datastore 存储会话信息和内存缓存以更快地访问该信息。

您可以使用在每个 HTTP 请求中注入的标准 HttpSession 对象来访问会话数据。

访问此HttpSession 的代码因您使用的框架而异。如果你愿意,我可以指定代码片段来帮助理解。

更新:

如果您使用的是 servlet,那么访问会话信息将如下所示:

public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private final String userID = "Pankaj";
private final String password = "journaldev";

protected void doPost(HttpServletRequest request,
        HttpServletResponse response) {
  HttpSession session=request.getSession();
  // access any value
  User user = (User)session.getAttribute("loggedInUser");
}

对于 Google 云端点,使用以下内容:

@ApiMethod
public Response getUser( HttpServletRequest servletReq) {
    HttpSession session = servletReq.getSession();
    session.getAttribute("loggedInUser");
}