如何从GWT服务器范围中获取GWT基本URL或模块名称?

如何从GWT服务器范围中获取GWT基本URL或模块名称?,gwt,Gwt,我知道您可以使用GWT.getModuleName()或getHostPageBaseURL()从客户端获取GWT模块名称,但是可以从服务器访问它吗 我想要的是已部署应用程序的基本URL。例如,如果GWT应用程序部署为http://foo.com/deploy1/MyModule/我想知道的是请求来自http://foo.com/deploy1/ 只要从HTTP请求中获取URI,我就可以得到完整的模块路径,而我真正需要的是基本路径(它将部署在同一域的不同子路径下)您可以查看RefererHTTP

我知道您可以使用
GWT.getModuleName()
getHostPageBaseURL()
从客户端获取GWT模块名称,但是可以从服务器访问它吗

我想要的是已部署应用程序的基本URL。例如,如果GWT应用程序部署为
http://foo.com/deploy1/MyModule/
我想知道的是请求来自
http://foo.com/deploy1/


只要从HTTP请求中获取URI,我就可以得到完整的模块路径,而我真正需要的是基本路径(它将部署在同一域的不同子路径下)

您可以查看
Referer
HTTP头:

您需要了解GWT中服务器和客户端之间的关系

因此,您看到的是通常的GWT RPC存根,您看到的是客户机、服务器、共享文件夹(您可以添加公用文件夹,以放置html、jsp或其他可通过模块路径直接访问的文件)

您可能没有意识到的是,模块中的类不需要满足客户端RPC请求的服务器端响应程序。在模块中,您将拥有RPC请求定义接口,在该接口中定义服务器端响应程序的路径@RemoteServiceRelativePath(“/hello”)

要通过路径“/hello”满足RPC请求,不需要在任何模块的“服务器”文件夹中编写servlet代码。你甚至可以

@RemoteServiceRelativePath("/hello.jsp")

事实上,我有一个登录JSP,它接受来自几个模块的RPC请求,它必须找出哪个模块发出请求

或者您可以使用RequestBuilder或放置JSON javascript包含请求

考虑到这一点,RPC服务器端响应程序如何被约束为由任何模块定义,而不管它被放置在特定模块的文件夹中?您只需让客户端通知服务器端响应程序客户端属于哪个模块。使用Map或HashMap作为RpC传输的数据类型将非常有用。在使用REquestFactory的情况下,实体的标识将能够通过实体对象名称空间告诉服务器模块是什么

将为您提供
/deploy1
路径


如果您需要完整的URL,您可以很容易地从另一个
HttpServletRequest
属性重建它,或者您可以从
getRequestURL
开始,调整结果以替换路径部分。

2年后,但是其他人可能会有同样的问题


无论如何,您可以通过使用
GWT.getModuleBaseURL()

来获得所需的确切数据。为了澄清这一点,我可以从
HttpServletRequest
获取URI,但这给了我
http://foo.com/deploy1/MyModule/
。我试图避免硬编码模块名
MyModule
,或将其复制到属性文件中。它是在by GWT模块xml文件中定义的,但我不想让它与其他文件源代码或其他文件保持同步。我可以获取URI,但问题在于获取URI时没有GWT模块名(或者在运行时获取要修剪的模块名)。
Referer
不会给我完整的子路径吗?+1,这是一个很好的解释,但是你没有像@ThomasBroyer那样提供检索基本URL问题的答案。我不确定我是如何忽略了这个方法的,但这似乎起到了作用。有时候最简单的答案就是最好的!根据文档,在服务器端使用
RemoteServiceServlet.getRequestModuleBasePath()
也可以实现这一点。
@RemoteServiceRelativePath("/hello.php")