我的网络配置声明了三个连接器,端口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
有关我如何解决这个问题的其他建议吗?
答案 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
。