没有RPC的GWT数据库访问

时间:2011-07-04 19:46:13

标签: java mysql web-applications gwt jdbc

我正在使用GWT进行网络应用,我需要访问mySql数据库。将只有一个客户端(该应用程序在iPad上使用)。有没有办法访问数据库没有 RPC?我正在寻找直接查询数据库的可能性。

谢谢!

5 个答案:

答案 0 :(得分:3)

有2.5个理由不能使用gwt直接访问MySQL。

原因#1。 GWT编译成Javascript。您需要打开数据库服务器的套接字。 GWT不允许您打开套接字。事实上,没有未扩展的浏览器(在html5出现之前)能够打开套接字。但您可以使用Flash actionscript或HTML 5 javascript打开套接字。

原因#2。 好吧,假设您使用的是HTML5套接字。你花了6个月的时间用Javascript写一个JDBC连接。但是,你的websocket仍然需要在服务器上寻址一个servlet,它可以帮助你的websocket建立一个持久的连接 - 而且mysql无法执行这样的建立。

原因#3。 SLD - SOP限制: (二级域同源政策) 标准浏览器将其页面限制为仅能够在与向浏览器提供该页面的服务器相同的第二级域(SLD)内请求和包含内容。顶级域名(以及顶级和半级域名)如.com,.org,.net,.me.us或.co.uk。因此,google.com,fbi.gov,mit.edu等域名是二级域名。虽然,mail.google.com将是一个第三级域名。因此,GWT只能在SLD的范围内工作。您的Web服务器也必须可以在与您的mysql服务器相同的SLD上访问。

SLD-SOP和隧道要求是关闭一个安全漏洞,可能允许任何tom-rick-or-mary通过浏览器登录您的系统。浏览器始终需要隧道连接到http服务器以外的服务器。隧道是指浏览器利用Web服务器作为yenta(为忙碌的身体/中间/匹配制造者而设的yiddish)来到另一台服务器。

您别无选择,只能使用GWT-RPC。也许您不希望使用RPC,那么您可以使用RequestBuilder,或Script-Include或RequestFactory。但它们仍然是多种隧道掘进方式。 http://h2g2java.blessedgeek.com/2011/06/gwt-requestbuilder-vs-rpc-vs-script.html

有一个原因可以从gwt客户端连接到数据库服务器: 您的数据库服务器必须运行httpd连接引擎。也就是说,您的gwt应用程序将访问数据库服务器thro http。我不熟悉哪个关系数据库有http访问权限。最有可能的是,您必须查询thro xml或json。

然而,我曾经工作的公司创建了我们自己的http服务,以允许“直接”客户端访问。 “直接”是用词不当,因为我们使用了tomcat。这是stil隧道。任何提供“直接”http访问的数据库公司仍然是隧道。隧道 - 不能逃脱它。

您可以使用Flash扩充浏览器并编写Flash应用程序而不是使用GWT。如果直接访问对您来说非常重要,则必须放弃GWT并在Flash中开发并为数据库服务器运行httpd引擎。

答案 1 :(得分:2)

GWT最终是Javascript。如Are there JavaScript bindings for MySQL? 所述,目前无法从Javascript访问MySQL。

因此,您无法从客户端GWT代码访问它。

答案 2 :(得分:1)

AFAIK这是不可能的,即使它是,但这将是一个非常糟糕的主意。你确定你确实需要一个数据库吗?也许像gwt-client-storage之类的东西会更合适。

修改

您的数据库我们可以公开访问并打开任何类型的攻击。<​​/ p>

编辑2

这甚至可能是一个更好的解决方案,因为它提供了对访问HTML5数据库API的支持,并且针对iPhone / iPad。

gwt-mobile-webkit

答案 3 :(得分:0)

如果你甚至成功这样做,简而言之,在浏览器上执行CTRL + U会使你的数据库名称,用户名,密码,表名等可见......并且已经完成,任何开发人员都想知道你的代码有办法破解你服务器中的任何东西。

答案 4 :(得分:0)

我认为,如果您希望将所有数据存储在数据库中,那是不可能的。我的意思是,GWT编译成javascript并在客户端(通常是Web浏览器)上执行javascript。

如果要访问服务器中存储的某些地方(通过某种方式),那么除了RPC之外别无选择。如果我是你,我会停止思考客户端 - 服务器范例(GWT是在考虑到这一点的情况下开发的)。也许某些嵌入式数据库如H2,然后通过JDBC保持连接。