我遇到了GAE和会话管理的问题。
我有一个端点,可以在成功登录后在会话中创建和存储用户信息。
但是,我无法在客户端检索回来的信息。我注意到的一件事是jsessionid和gae session id不同。
会话正在google的数据存储区中创建,但就像我说的那样,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>
答案 0 :(得分:0)
根本问题是您的应用程序实际上并未直接处理端点。他们首先通过谷歌的架构,这就是为什么你可能会得到不一致的JsessionId,因为你正在调度Servlet请求,但是端点请求实际上正在其他地方。
我们用于端点的是作为成功登录的结果返回“令牌”,然后我们在来自客户端的每个请求上发送该令牌(标头)并基于该令牌获取会话。我们正在使用objectify的@Cache积极地缓存会话,因为它们的信息不会经常更改,我们只是将其用于授权和身份验证。
答案 1 :(得分:0)
我有appengine自定义域的这个问题。 这是因为servlet端点域错误匹配。 对于servlet,域名为“www.myapp.com”,端点为“myapp”.appspot.com