2013-07-17 147 views
1

我的Web配置聲明端口8080上三個連接器,http和https的端口8081和8082如何限制訪問特定端口的某些URL?

在我的servlet我想限制訪問某些網址模式,以一個特定的端口,如/ Admin的請求應該被拒絕,除非它在端口8082上。這很簡單,我可以檢查servlet服務方法中的端口號。

但我還需要能夠允許客戶更改端口。如果客戶希望僅在端口9000(而不是8083)上允許管理員請求,那麼該策略將失敗。

一種方法我能想到的是附加屬性在server.xml中增加了連接器和訪問它在servlet。這可能嗎?

爲了詳細說明,我想在我的servlet中加入類似下面的server.xml

<Connector port="9000" connectorType="admin".... 

然後以某種方式得到綱領性這個如下。我知道getConnectorProperties不存在,這只是一個例子。

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

有關我如何解決這個問題的其他建議?

回答

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> 

注意,這是一個簡約例子。

如果您需要更復雜的URL模式,您可以使用web.xml s的應用程序(servlet-mappings等)。

基本上,這不是一個授權錯誤...這是一個未映射的URL。您的應用程序不支持非SSL端口上的管理資源。所以你會得到404 page not found

+0

背後發生了什麼?我們在這種情況下創建了兩個實例嗎? –

+1

實例是什麼?仍然只有一個過程。但是兩個...服務:)。服務將連接器綁定到引擎。你可以進一步閱讀[他們的文檔](https://tomcat.apache.org/tomcat-7.0-doc/config/service.html) – yair

相關問題