2015-04-01 60 views
1

我想知道,如果有一个干净的方式来请求一个Web应用程序的名称不出现在请求url中的请求。某种程度上,url应该是webapp的别名。另外,这个别名不应该是静态的,也不能用这个单一的webapp修复,但是我需要能够轻松地改变别名后面的webapp,以便进行版本增量。 的事,那来我的心是非静态webapp别名

  • 打造“门面”的webapp请求重定向
  • 重命名完整的web应用程序

两个想法不会导致期望的结果。我想有一个更轻量级的解决方案。

这可能吗?

+0

通常,这是通过前端网络系统实现的,无论是负载均衡设备还是重写apache/nginx安装。 – Affe 2015-04-01 21:30:46

+0

@Affe好吧,但这听起来像是一个开销?我不希望我的整个流量重定向,只是在我的容器内部请求一个webapp。你可以详细阐述一个简单的用例场景吗? – tareq 2015-04-01 21:40:49

+0

你目前使用什么作为前端?你是否将tomcat直接暴露给互联网? http://nginx.org/en/docs/http/ngx_http_rewrite_module.html – Affe 2015-04-01 21:51:45

回答

1

感谢来自Alexander的帖子,我发现了正确的轨道,但我使用了一些额外的工作,这或多或少是我原始问题中提到的第1点中提到的门面webapp。首先,我将我所有的标准webapps部署在/tomcat/webapps中,其中一个标准的context.xmlautoDeploy模式处于打开状态。为了捕获所有其他请求,这些请求与部署的上下文不匹配,我设置了一个新的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

1

如果你想使用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了解更多信息。

+0

这会有缺点,即如果上下文文件后面的web应用程序发生更改,我必须为每个公开的web应用程序维护一个context.xml文件并对其进行修改。我对吗?另外我想,我需要在修改后重新启动tomcat。 – tareq 2015-04-02 10:14:01

+0

如果您将此''节点添加到** context.xml('conf/context.xml'),它将** **每个webapp中**一个节点**,并且仅** context.xml * *。我想你也可以在'conf/Catalina/localhost/'中为每个webapp添加一个context.xml,但这是一个不同的故事。另一种方式是由@Affe(“...负载均衡设备或apache/nginx”)提出的 - 这将不需要配置tomcat,而是配置一些东西 – Alexander 2015-04-02 11:28:00