转发上下文之间的请求在Tomcat中(Forwarding requests between con

2019-07-29 21:31发布

我希望能够做到跨上下文请求转发到Tomcat与Tuckey URLRewrite过滤器。 例如,我想能够路由与像一个SEO- /用户友好的URL的输入请求http://example.com/group-elements/300245/some-descriptive-text ,其中“组元素“不是部署的应用程序的名称,映射到一个Java春季控制器方法应用‘富’,就像一个URL http://example.com/foo/app/group/300245/elements 。 我使用Tomcat 7.0.27和3.2.0 URLRewrite; 我与Java春3.1的Web应用程序的工作。

所述URLRewrite 3.20文档注意到用于“到”滤波器参数元件一个可选的“上下文”属性:

If your application server is configured to allow "cross context" communication then this attribute can be used to forward (and only forward, not redirect or other "to" types) requests to a named servlet context.

On Tomcat, for instance, the application contexts in the server configuration (server.xml or context.xml) need the option crossContext="true". For instance, the two applications mentioned before ("app" and "forum") have to be defined as:

<Context docBase="app" path="/app" reloadable="true" crossContext="true"/>
<Context docBase="forum" path="/forum" reloadable="true" crossContext="true"/>

鉴于与有关功能原来的讨论中,“语境”属性似乎正是我要找的。 不过,我一直无法正常启用跨上下文请求转发。

下面是的conf / server.xml中我的“语境”入境申请“富”:

<Context docBase="foo" path="/foo" reloadable="true" crossContext="true"/>

我在的webapps / ROOT / WEB-INF /我urlrewrite.xml文件和web.xml文件。 这里就是他们的样子:

urlrewrite.xml:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 3.2//EN" 
"http://tuckey.org/res/dtds/urlrewrite3.2.dtd">

<urlrewrite>    
    <rule>
        <from>baz</from>
        <!-- Note: this 'to' element's value has an error.  See the edit at bottom of this post for corrected version. -->
        <to context="foo">/foo/app/group/300245/elements</to> 
    </rule> 
</urlrewrite>

web.xml中:

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_5.xsd" version="2.5">

    <filter>
        <filter-name>UrlRewriteFilter</filter-name>
        <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
        <init-param>
            <param-name>logLevel</param-name>
            <param-value>WARN</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>UrlRewriteFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

</web-app>

在urlrewrite.xml上面定义的规则是有意基本和硬编码的。 在这种情况下,我只是试图让规则制定的正则表达式“到”和“从”前工作的跨情境的方面。

当我要求http://example.com/baz与地方的规则下,Tomcat返回404错误说“所请求的资源(/巴兹)不可用。” 我试着在“到”滤波器参数有一些变化,但没有尚未奏效。 我一直没能找到如何“语境”,应使用任何例子。

我如何能得到这种跨上下文请求过滤的任何想法来工作? 它甚至有可能? 我想我也许可以达到我想要重命名foo.war到ROOT.war或叙述改变根应用做在这里 ,但我想尝试通过URLRewrite这样做,除非这样做是不可行或在其正面是一个坏主意。

如果显示更多我的配置中会有所帮助,请让我知道。 感谢您事先的任何输入。

编辑

由于克里斯托弗·舒尔茨为有用的答案。 1)不具有的webapps / ROOT / META-INF一个context.xml文件,和2)具有错误在“到”元素​​中的URL重写规则中的webapps /:在我的情况下,问题是由两个因素引起ROOT / WEB-INF / urlrewrite.xml。

此修复程序涉及到把一个正确的context.xml文件中的webapps / ROOT / META-INF。 对于其他任何人遇到这个问题的参考,该文件最终看上去是这样的:

web应用/ ROOT / META-INF / context.xml的

<?xml version='1.0' encoding='utf-8'?>

<Context docBase="ROOT" path="/" reloadable="true" crossContext="true" />

正如舒尔茨提到,它是只需要与crossContext =“真”的上下文中给定的URL重写规则(在这里,这是ROOT)在“从”元素所隐含的背景下定义。 这是没有必要明确定义上下文中“到” URL重写规则的应用程序。 换句话说,你不应该需要手动创建该应用程序的context.xml文件 - 因此继续上面的例子,你就不需要手动定义,把一个context.xml文件到的webapps /富/ META-INF /。

舒尔茨的回答反映了官方的Tomcat文档中定义的上下文中的建议: http://tomcat.apache.org/tomcat-7.0-doc/config/context.html#Defining_a_context 。

这个问题也得到了事实,在我最初的文章的网址重写规则有一个错误引起的。 正确的版本应该是:

urlrewrite.xml:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 3.2//EN" 
"http://tuckey.org/res/dtds/urlrewrite3.2.dtd">

<urlrewrite>    
    <rule>
        <from>baz</from>
        <!-- Note: the use of '/app' instead of '/foo/app/' below -->
        <to context="foo">/app/group/300245/elements</to> 
    </rule> 
</urlrewrite>

Answer 1:

如果你的(真正的)Web应用部署到/foo ,你想在即时重写URL像/group-elements/baz转发( 定向)到/foo/app/group/300245/elements ,那么你”重新将不得不重写你的过滤器部署到两个地方之一: /group-elements/

上述结构似乎部署到ROOT(这 / ),但是然后映射URL /baz/foo/app/group/300245/elements 。 相反,你可能希望这样的:

<rule>
    <from>/group-elements/baz</from>
    <to context="foo">/foo/app/group/300245/elements</to>
</rule>

它看起来像试图击中http://example.com/baz我本来期望的工作。 魔术的最后一位将要作出的ROOT背景下的跨情境(请注意,你的web应用并不需要是跨情境:只有urlrewrite人做)。 您可以更改ROOT web应用程序是由addint跨上下文crossContext="true"webapps/ROOT/META-INF/context.xml

最后,你真的应该停止把<Context>元素在server.xml中:让他们在那里基本上意味着你需要重新启动Tomcat,以改变你的web应用的部署。



Answer 2:

意见后做我走到这一步可能的结论:

我认为你是混合反向代理的概念与跨情境。 跨情境是方法相同的应用服务器中共享两个Web的应用程序之间交换数据。 像“的Apache HTTP” A反向代理可以重写的URL将它传递给它后面某个服务器,从而有效地隐藏任何不想要的部分或执行等的负载平衡的其它操作。

该基础设施将是:客户端 - >反向代理 - >应用程序服务器



文章来源: Forwarding requests between contexts in Tomcat