【问题标题】:"Sessions" with Google Cloud Endpoints与 Google Cloud Endpoints 的“会话”
【发布时间】:2014-06-29 10:19:33
【问题描述】:

这个问题只是为了确认我对这个概念很清楚。

据我了解,Google Cloud Endpoints 是 Google 对 REST 服务的一种实现,因此它们无法在内存中保留任何“会话”数据,因此:

  • 用户必须随每个请求发送身份验证数据
  • 我以后要使用的所有数据必须被持久化,也就是说,对于我收到的每个 API 请求,我都必须访问 Datastore,执行一些操作并再次存储数据。

这是正确的吗?如果是这样,这在性能方面真的很好吗?

【问题讨论】:

    标签: java google-app-engine rest session google-cloud-endpoints


    【解决方案1】:

    是的,您可以使用会话,只需在您的 API 方法中使用 HttpServlet 放置另一个参数:

    @ApiMethod
    public MyResponse getResponse( HttpServletRequest req, @Named("infoId") String infoId ) {
        // Use 'req' as you would in a servlet, e.g.
        String ipAddress = req.getRemoteAddr();
        ...
    }
    

    【讨论】:

    • 我从这个问题中得到它:link
    • 这真的很有趣,但它不正确...您可以传递 HttpRequest 参数这一事实并不意味着您可以使用会话...正如您在链接中所解释的那样'已复制您的回复,这对于获取请求信息很有用。但是 Endpoint 不会转发请求(就像 Servlet 一样),它只是返回一个对象 MyResponse,因此会话将丢失...
    • 查看此链接cloud.google.com/appengine/docs/java/config/appconfig 并搜索“启用会话”。这样,您的服务器将有一个 MaxInactiveInterval 等于 -1 的会话,这表明该会话永远不会超时。
    • 我认为此示例中缺少的是在 @API 注释上使用 auth = @ApiAuth(allowCookieAuth = AnnotationBoolean.TRUE) 以便 JSESSIONID cookie 到达端点并进行会话在请求对象中可用。
    【解决方案2】:

    数据存储非常快,尤其是在您进行键查找(与查询相反)时。如果您使用 NDB,那么您将受益于自动 memache 您的查找。

    【讨论】:

    • 谢谢@Shay!请原谅我的无知,但是当您说“密钥查找”时,您的意思是直接使用getObjectById 而不是查询,对吗?什么是 NDB?
    • 所以你是一个 Java 人,NDB 是 Python 的。
    • 是的:键查找正在使用 getObjectById
    • 再次感谢。是的,我绝对是一个 Java 人。我忘记将它添加为标签,我想有时我只是忘记了 Java 之外的东西 :)
    • @MikO:如果您使用的是 Java,那么 Objectify 提供类似于 NDB 提供的自动内存缓存。
    【解决方案3】:

    是的,您的 Cloud Endpoints API 后端代码(Java 或 Python)仍在 App Engine 上运行,因此您对 App Engine 上的所有资源拥有相同的访问权限。

    虽然您不能为会话设置客户端 cookie,但您仍然可以获取用户的请求并将用户特定的数据存储在数据存储中。正如@Shay Erlichmen 所提到的,如果您将数据存储与memcache 和上下文缓存相结合(就像ndb 所做的那样),您可以非常快速地进行这些查找。

    要在 Python 或 Java 中执行此操作,需要在 API 和/或方法的注释/装饰器中指定 allowed_client_idsaudiences。请参阅docs 了解更多信息。

    Python:

    如果你想在 Python 中获取用户,请调用

    endpoints.get_current_user()
    

    来自已用allowed_client_idsaudiences 注释的请求。如果这返回None,那么没有有效的用户(你应该返回一个401)。

    Java:

    要获取用户,在带注释的方法(或包含在带注释的 API 中的方法)上,只需在请求中指定用户对象:

    import com.google.appengine.api.users.User;
    
    ...
    
      public Model insert(Model model, User user) throws
          OAuthRequestException, IOException {
    

    与在 Python 中一样,检查 user 是否为 null 以确定是否随请求一起发送了有效的 OAuth 2.0 令牌。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-18
      • 1970-01-01
      • 2016-04-01
      • 2013-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-29
      相关资源
      最近更新 更多