我正在尝试编写一个只适用于我自己的谷歌应用引擎应用程序。 (我知道这听起来很奇怪......暂时)我正在尝试编写一个Login servlet,它将使用google的UserService对用户进行身份验证,并且只有在我登录时才会让用户进入应用程序并显示一条提示注销的简短消息其他所有人。
这是我写的代码:
public class MainPageServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
resp.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
resp.setContentType("text/html");
UserService userService = UserServiceFactory.getUserService();
User user = userService.getCurrentUser();
if (user != null) {
if(user.getEmail().equals("aaadith@gmail.com")) {
resp.getWriter().println("done");
}
else {
resp.getWriter().println("Hello, " + user.getNickname()+"<br>");
resp.getWriter().println("Thanks for your interest. But this application is still not available to everybody.");
resp.getWriter().println("<a href="+UserServiceFactory.getUserService().createLogoutURL(userService.createLoginURL(req.getRequestURI()))+">Log out</a>");
}
} else {
resp.sendRedirect(userService.createLoginURL(req.getRequestURI()));
}
}
}
与“驱走”所有其他用户相关的代码运行正常。但是当我登录时遇到问题:登录后,它会按预期显示“已完成”消息。但是,在此之后,如果我从那里打开一些其他谷歌服务并注销并再次调用此servlet,它仍会显示消息“已完成”。我曾经期望应用程序会提示我再次登录......这种情况没有发生..我认为它发生了,因为结果是缓存而禁用缓存(方法中的第一行)......但问题仍然存在那......怎么了?我如何得到预期的行为?
答案 0 :(得分:2)
你没有。如果您希望用户注销您的服务,则需要注销您的服务(通过调用UserManager的注销方法)。他们与其他Google服务共享用户名和密码的事实并不意味着退出其他服务会自动将其从您的服务中删除。
答案 1 :(得分:0)
我对此不太确定,但是当您第一次登录“appengine”应用程序时,您必须授予访问您的个人资料信息的权限(我认为这是OAuth标准)。您可以将此限制为天数。之后,该页面可以自动读取您的电子邮件,昵称和Google ID,直到访问权限到期为止。
解决这个问题的方法是实现自己的会话机制,并使用google登录来检索userId(以及您的内部配置文件对象)以启动会话(也称为登录)。
如果您希望仅从您的网页退出 - 您只会终止会话,而不是从Google用户帐户退出