我想知道,如果有一个干净的方式来请求一个Web应用程序的名称不出现在请求url中的请求。某种程度上,url应该是webapp的别名。另外,这个别名不应该是静态的,也不能用这个单一的webapp修复,但是我需要能够轻松地改变别名后面的webapp,以便进行版本增量。 的事,那来我的心是非静态webapp别名
- 打造“门面”的webapp请求重定向
- 重命名完整的web应用程序
两个想法不会导致期望的结果。我想有一个更轻量级的解决方案。
这可能吗?
我想知道,如果有一个干净的方式来请求一个Web应用程序的名称不出现在请求url中的请求。某种程度上,url应该是webapp的别名。另外,这个别名不应该是静态的,也不能用这个单一的webapp修复,但是我需要能够轻松地改变别名后面的webapp,以便进行版本增量。 的事,那来我的心是非静态webapp别名
两个想法不会导致期望的结果。我想有一个更轻量级的解决方案。
这可能吗?
感谢来自Alexander的帖子,我发现了正确的轨道,但我使用了一些额外的工作,这或多或少是我原始问题中提到的第1点中提到的门面webapp。首先,我将我所有的标准webapps部署在/tomcat/webapps
中,其中一个标准的context.xml
和autoDeploy
模式处于打开状态。为了捕获所有其他请求,这些请求与部署的上下文不匹配,我设置了一个新的Web应用程序,作为未匹配请求的默认Web应用程序。我们称之为dispatcher-app
。
要使这个工作,我必须将它设置为ROOT
。要以原名称部署它,我将它定位在/tomcat/webapps2
及其关联的context.xml
的/tomcat/conf/Catalina/localhost/ROOT.xml
之下。有必要将它放在/webapps
之外,以防止在tomcat中使用其他web应用程序使用的autoDeploy模式进行双重部署。对其他信息可以在这里找到:http://tomcat.apache.org/tomcat-7.0-doc/config/context#Naming
的ROOT.xml
看起来是这样的:
<Context
path=""
docBase="/path/to/tomcat-base/webapps2/dispatcher-app"
crossContext="true"
/>
在dispatcher-app
的web.xml中确认,它采用
<servlet-mapping>
<url-pattern>/</url-pattern>
</servlet-mapping>
的dispatcher-app
内外观对于用户使用uriInfo.getAbsolutePath()
请求的原始路径。然后,它将来自url的应用程序与在tomcat中运行的应用程序(从自定义配置文件中已知)进行匹配。如果匹配,则配置文件知道应该向哪个应用程序发送。例如,用户请求myserver/webapp-1/test?param=value
,并将其转发给myserver/webapp-1.1.2/test?param=value
。如果应用程序版本发生更改,则要转发的Web应用程序可以在配置文件中手动更新。
实际应向前使用
RequestDispatcher dispatcher=servletContext.getRequestDispatcher(redirectTo);
dispatcher.forward(request, response);
因为远期将不会对用户可见的进行。
由于我无法做到这一点(请参阅Cross-context request forwarding in tomcat results in java.lang.ClassCastException: org.glassfish.jersey.message.internal.TracingLogger),我现在只需使用307重定向。
return Response.status(307).location(new URI(redirectTo)).build();
这个的缺点是浏览器会在地址栏中显示重定向URL。
UPDATE: 的RequestDispatcher
作品现在,只要不是上述这种特殊情况下/ web应用。所以我更喜欢通过重定向方式。
有一点要注意的是,在第二web应用程序是基于容器的认证(例如realm
)将不会生效(如同我们前进“的背后” tomcat的门面),所以dispatcher-app
需要一个身份验证方法本身或认证需求用另一种机制,如RequestFilter
。
如果你想使用Tomcat做的唯一手段,可以静态映射你的webapp的路径在Tomcat中context.xml
定义上下文和映射request path
(“路径”)为webapp dir
(“的docBase”)。
只需添加到您的<tomcatDir>/conf/context.xml
:
<Context
path=""
docBase="/<pathToYourWebapp>/<yourApp>"
/>
这有副作用,你只能有一个Web应用程序,当然,因为每个请求UND /
映射到你的web应用。
查看http://tomcat.apache.org/tomcat-8.0-doc/config/context.html#Common_Attributes了解更多信息。
这会有缺点,即如果上下文文件后面的web应用程序发生更改,我必须为每个公开的web应用程序维护一个context.xml文件并对其进行修改。我对吗?另外我想,我需要在修改后重新启动tomcat。 – tareq 2015-04-02 10:14:01
如果您将此'
通常,这是通过前端网络系统实现的,无论是负载均衡设备还是重写apache/nginx安装。 – Affe 2015-04-01 21:30:46
@Affe好吧,但这听起来像是一个开销?我不希望我的整个流量重定向,只是在我的容器内部请求一个webapp。你可以详细阐述一个简单的用例场景吗? – tareq 2015-04-01 21:40:49
你目前使用什么作为前端?你是否将tomcat直接暴露给互联网? http://nginx.org/en/docs/http/ngx_http_rewrite_module.html – Affe 2015-04-01 21:51:45