当前位置: 首页 > 知识库问答 >
问题:

通过代理使用Java URL中的路径访问MongoDB

武嘉祥
2023-03-14

如果我在端口80上的server.com/mongo有一个mongo。我不能打开这里的任何端口。我如何用Java连接到它?
这不起作用:

mongodb://user:pass@server.com/mongo:80/dbName

30sec后的例外情况:

在server.com/dbname上连接时出错:等待与ReadPreferenceServerSelector{ReadPreference=Primary}匹配得服务器时,在30000 ms后超时.群集状态的客户端视图为{type=unknown,servers=[{address=server.com/mongo:80,type=unknown,state=connecting,exception={com.mongodb.mongosocketexception:server.com/mongo},由{java.net.unknownhostexception:server.com/mongo}}引起]

我还试着用:

mongodb://user:pass@server.com:80/mongo/dbName

例外情况是:

在server.com/dbname上连接时出错:连接字符串包含无效的主机“server.com:80/mongo”。端口“80/MONGO”无效,它必须是介于0和65535之间的整数

我的java代码:

String url = "mongodb://user:pass@server.com/mongo:80/dbName";
MongoClientURI mongoUri = new MongoClientURI(uri);
MongoClient mongo = new MongoClient(mongoUri);

MongoDatabase db = mongo.getDatabase(dbName);

MongoIterable<String> collectionNames = db.listCollectionNames();
for (String name : collectionNames) {
    System.out.println(name);
}
<VirtualHost *:80>
    DocumentRoot /var/www/html

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
    LogLevel warn

    <Location /mongo>
        ProxyPass http://localhost:27017/
        ProxyPassReverse http://localhost:27017/
    </Location>

    <Location /mongo/>
        ProxyPass http://localhost:27017/
        ProxyPassReverse http://localhost:27017/
    </Location>

    ExpiresActive On
    ExpiresDefault "access plus 5184000 seconds"

    AllowEncodedSlashes On
</VirtualHost>

看起来您正试图在本机驱动程序端口上通过HTTP访问MongoDB。

我的身份验证在Mongo中是正常的:

>db.auth("user", "pass")
1
>use dbName
switched to db dbName

编辑

mongo server.com
mongo server.com:80
mongo server.com:80/mongo
mongo server.com/mongo
mongo server.com/mongo:80
mongo user:pass@server.com/...

和:

mongo -u user -p pass server.com/...

这里的mongo不是我的数据库名称,而是服务器上的额外路径

共有1个答案

董新觉
2023-03-14

主要问题是路径部分(/mongo)被mongo理解为被调用的数据库,而不是下面的路径部分(/dbname)。

使用NGinx的解决方案是编辑可用站点,如下所示:

upstream stream_mongo_backend {
   server localhost:27017;
}

server {
        listen       80;
        listen  443 ssl;
        server_name  server.com;

        include path/to/cert.conf;

        location /mongo {
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $http_host;
                proxy_set_header X-NginX-Proxy true;
                proxy_pass http://stream_mongo_backend/;
                proxy_redirect off;
        }
}
 类似资料:
  • 27.6 通过代理访问MBeans Spring JMX 允许你创建代理,它将重新路由到本地或者远程MBeanServer中注册的MBean。这些代理提供了标准的Java接口来和MBean进行交互。下面的代码展示了如何在本地允许的MBeanServer中配置代理: <bean class="org.springframework.jmx.access.MBeanProxyFactoryBean">

  • 21.6. 通过代理访问MBeans Spring JMX允许你创建代理,这个代理改变到注册到本地或远程 MBeanServer 的MBean的调用。 这些代理提供里一个标准的Java接口,通过它,你可以和MBean相合。 下面的代码展示了如何为一个运行在本地 MBeanServer 的配置一个代理: bean id="proxy"> <property name="objectName"

  • 问题内容: 我正在寻找一种在Java App(使用JDBC)中打开Access MDB文件的方法。 快速的Google搜索建议我为此需要JDBC-ODBC Bridge。 这是否意味着我需要配置要在其上运行应用程序的每个系统,以便为要打开的MDB提供ODBC DSN? 还有一个问题(因为我以前从未使用过ODBC):通信是通过某种套接字(以客户机/服务器方式)还是通过方法/函数调用(例如嵌入Derb

  • 假设我有三个带有nginx的docker容器。它们暴露的端口分别映射到8080、8181和8282。我想在8080上配置服务器,将/example01和/example02代理给另外两个应用程序。这是我的配置文件: 因此,如果我运行容器,每个应用程序都是可访问的(http://localhost:8080、http://localhost:8181和http://localhost:8282)。

  • 我正在尝试使用Azure应用程序代理公开我的本地API。 我已经成功地将其配置为与设置为Passthrough的预身份验证一起使用。当我将预身份验证更改为Azure Active Directory时,我可以通过浏览器成功访问endpoint。然而,当我尝试从代码中调用本地endpoint时,我会收到Microsoft登录页面的HTML。成功的请求将返回JSON响应。 我正在关注一篇Microso

  • 问题内容: 我有一个像这样的数据结构: 我想使用这些变量访问数据: part1name应该用的值(即“第1部分”)填充。part2quantity填充60。 无论如何,可以使用纯JavaScript或JQuery来实现这一目标? 问题答案: 我只是根据已经拥有的一些类似代码制作的,它似乎可以工作: 用法:: 编辑一些人已经注意到,如果传递的字符串最左边的索引与对象内正确嵌套的条目不对应,则此代码将