如何限制特定端口对某些URL的访问?

时间:2013-07-17 21:35:39

标签: tomcat tomcat7

我的网络配置声明了三个连接器,端口8080上的http和端口8081和8082上的https。

在我的servlet中,我想限制对特定端口的某些网址模式的访问,例如应该拒绝对/ Admin的请求,除非它在端口8082上。这很简单,我可以检查servlet服务方法中的端口号。

但我还需要能够允许客户更改端口。如果客户希望仅在端口9000(而不是8083)上允许管理员请求,则此策略将失败。

我能想到的一种方法是在server.xml中为连接器添加一个额外的属性,并在servlet中访问它。这可能吗?

详细说明,我想在server.xml

中添加以下内容
<Connector port="9000" connectorType="admin"....

然后以某种方式在我的servlet中对此进行编程,如下所示。我意识到getConnectorProperties不存在,这只是一个例子。

 if (request.getRequestURL().startsWith("/admin")) {
   String connectorType = request.getConnectionProperties().get("connectorType");
   if (! "admin".equals(connectorType)) {
     // return unauthorized

有关我如何解决这个问题的其他建议吗?

1 个答案:

答案 0 :(得分:1)

您似乎正在为不同的端口使用不同的上下文根(= apps)。这不应该以编程方式完成。接受不同端口或协议的应用程序在server.xml中配置为具有不同的Service组件:

<Server>
    <!-- Define one Service for the open app -->
    <Service name="myOpenApp">
        <Connector port="8080"/>
        <Engine name="myOpenApp" defaultHost="localhost">
            <Host name="localhost"> <!-- default appBase is webapps -->
                <Context docBase="path/to/my/open/app"/>
                <!-- docBase is relative to appBase but may also refer an absolute path -->
            </Host>
        </Engine>
    </Service>

    <!-- and another for the restricted -->
    <Service name="onlyForAdmins">
        <Connector port="8081" SSLEnabled="true" scheme="https"/>
        <Connector port="8082" SSLEnabled="true" scheme="https"/>
        <Engine name="onlyForAdmins" defaultHost="localhost">
            <Host name="localhost"> <!-- default appBase is webapps -->
                <Context docBase="path/to/admins/only"/>
                <!-- docBase is relative to appBase but may also refer an absolute path -->
            </Host>
        </Engine>
    </Service>
</Server>

请注意,这是一个简约的例子。

如果您需要更复杂的网址格式,可以使用web.xml个应用程序(servlet-mappings等)。

基本上,这不是授权错误......这是一个未映射的URL。您的应用程序不支持非SSL端口上的管理资源。所以你会得到404 page not found