【问题标题】:GAE Session id mismatchGAE 会话 ID 不匹配
【发布时间】:2016-04-09 22:50:28
【问题描述】:

我遇到了 GAE 和会话管理问题。

我有一个端点,可以在成功登录后在会话中创建和存储用户信息。

但是,我无法在客户端检索信息。我注意到的一件事是 jsessionid 和 gae 会话 id 不同。

会话正在谷歌的数据存储中创建,但就像我说的,id 与客户端的不同 (jsessionid)。

我已经使用 servlet 而不是端点进行了测试,一切都像一个魅力一样工作......所以我为了查明根本原因所做的就是将我的代码缩减为一个非常基本的示例(见下文)。

知道根本原因是什么吗?感谢你的帮助。谢谢。

GAE 端点

@ApiMethod(name = Path.OperationUrl.TEST, path = Path.OperationUrl.TEST, httpMethod = HttpMethod.POST)
public Response test(HttpServletRequest request) throws DatabaseException {
    String name = request.getParameter("name");
    String pwd = request.getParameter("pwd");

    //creating a session
    HttpSession session = request.getSession();
    session.setAttribute("name", name);
    session.setAttribute("pwd", pwd);
    session.setAttribute("sessionId", session.getId());


    return new Response(STATUS.SUCCESS, "Session was created...." + session.getId());
}

JSP 页面

<%@ page pageEncoding="UTF-8" %>
<%@ page session="false" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="US-ASCII">
<title>Login Page</title>
</head>
<body>

<button type="submit" onclick="callEndpoint();">Click</button>

<p>username: ${name}</p/><br>
<p>pwd: ${pwd}</p>

<script>
function callEndpoint(){
    gapi.client.userEndpoint.test().execute(function(resp) {
        if(resp.status === 'SUCCESS'){
            alert(resp.message);
        }else{
            alert(resp.message);
        }
    });
}
</script>
<script>
function init() {
    var location = window.location.origin;
    gapi.client.load('userEndpoint', 'v1', null, location+'/_ah/api');
}
</script>
<script src="//apis.google.com/js/client.js?onload=init"></script>
</body>
</html>

【问题讨论】:

    标签: java google-app-engine session


    【解决方案1】:

    好吧,根本问题是端点实际上并没有由您的应用直接处理。他们首先通过 Google 的架构,这就是为什么您可能会得到不一致的 JsessionId,因为您正在分派 Servlet 请求,但端点请求实际上来自其他地方。

    我们用于端点的是返回一个“令牌”作为成功登录的结果,然后我们在来自客户端的每个请求中发送该令牌(标头)并根据该令牌获取会话。我们正在使用 objectify 的 @Cache 来积极缓存会话,因为它们的信息不会经常更改,我们只是将其用于授权和身份验证目的。

    【讨论】:

      【解决方案2】:

      我在使用 appengine 自定义域时遇到了这个问题。 发生这种情况是因为 servlet 端点域不匹配。 对于 servlet,域是“www.myapp.com”,对于端点“myapp”.appspot.com

      【讨论】:

        猜你喜欢
        • 2016-05-15
        • 2018-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多