在App Engine文件上载期间登录用户

时间:2012-01-23 00:40:15

标签: java security google-app-engine

我正在编写一个Google App Engine应用程序,使用表单POST和createUploadUrl方法将文件上传到Blobstore。在处理上载的HttpServlet中,UserService.getCurrentUser和getUserPrincipal返回null。用户已登录,其他RemoteServiceServlet调用可以检索它。如何在上传过程中获取登录的用户名?

2 个答案:

答案 0 :(得分:0)

如果所有其他方法都失败了,您可以将表单作为参数发送,或者将名称添加到您可以在处理程序中检索的会话对象中。但是在HTTP POST(python)中获取用户名和其他任何地方一样,并且应该使用Java工作。

但无论如何你有3个选择: - 应该工作的普通方式 - 如果失败,请在表单提交页面上获取用户名和表单 - 如果所有其他方法都失败,请使用会话对象,您可以在其中检索用户名

理想的解决方案是第一种,其他两种是解决方法,因为您的工作方式应该有效。

答案 1 :(得分:0)

我假设您只在本地开发模式下获得此功能。如果是这样,这里是解释(和解决方案):用户登录到127.0.0.1但是为新上载返回到blobstore(在本地模式下)的URL包含计算机名称。因此,在POST重定向从blobstore到上传处理程序期间会话中断,并且您的服务不会将用户识别为已登录。

这是一种解决方法。下面的方法存在于服务器上,可以直接通过RPC(来自GWT应用程序)或servlet来调用:

public String getNewUploadLink() {
    BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();
    String url = blobstoreService.createUploadUrl("/myappname/upload");
    String modifiedUrl = url.replace("ThisIsMyComputerName", "127.0.0.1"); 
    return modifiedUrl;
}

您会看到它在将URL返回给客户端之前对其进行操作。一个更好的版本将检查服务是在dev或生产模式下运行,然后相应地采取行动,但它突出了这个问题的根本原因,以便您可以继续在本地计算机上进行开发。