服务器入站重定向无法找到下一个Restlet

时间:2015-04-22 20:29:23

标签: java spring redirect restlet

我试图将简单的重定向添加到使用Restlet构建的Web应用程序中,并且它证明是非平凡的。任务很简单:我想将所有丢失的文件从Web应用程序重定向到同一个静态文件。

我使用org.restlet.routing.Redirector使用以下值(我使用Spring注入):

<bean name="router" class="org.restlet.ext.spring.SpringRouter">
    <constructor-arg ref="trackerComponentChildContext" />
    <property name="attachments">
        <map>
            <entry key="/api" value-ref="apiRouter" />
            <entry key="/statics" value-ref="staticsDirectory" />
            <entry key="/" value-ref="staticsRedirector" />
        </map>
    </property>
</bean>

<bean id="staticsRedirector" class="ca.uhnresearch.pughlab.tracker.restlets.CustomRedirector">
    <constructor-arg ref="trackerComponentChildContext" />
    <constructor-arg value="{o}/statics/index.html" />
    <constructor-arg value="7" />
</bean>

我可以相对简单地使用文件层次结构,但我只想在同一个应用程序中发送任何与/api/statics/statics/index.html不匹配的内容。

Restlet 几乎得到它,现在看起来确实拿起了对正确文件的引用,它只是没有完全服务它。

我已将整件事的工作副本(包括蒂埃里的建议)放在:https://github.com/morungos/restlet-spring-static-files。我想要发生的事情就像下面的等效顺序尝试:

curl http://localhost:8080/statics/**/*点击相应的/statics/**/*

curl http://localhost:8080点击主/statics/index.html

curl http://localhost:8080/**/*点击主/statics/index.html

1 个答案:

答案 0 :(得分:1)

我对你的问题做了一些测试,我无法弄清楚如何收到你的信息:-(。也许是因为我没有完整的代码。

事实上,我在SpringRouter本身的层面上看到了一个问题。我想将重定向器附加attachDefault而不是attach("/", ...) / attach("", ...)。方法setDefaultAttachment实际上执行attach("", ...)

所以我通过以下更新做了一些工作:

  • 创建自定义SpringRouter

    public class CustomSpringRouter extends SpringRouter {
        public void setDefaultAttachment(Object route) {
            if (route instanceof Redirector) {
                this.attachDefault((Restlet) route);
            } else {
                super.setDefaultAttachment(route);
            }
        }
    }
    
  • 创建自定义Redirector。我从组件而不是子上下文中获取了上下文。

    public class CustomRedirector extends Redirector {
        public CustomRedirector(Component component, String targetPattern, int mode) {
            super(component.getContext(), targetPattern, mode);
        }
    }
    

然后我使用以下Spring配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="myComponent" class="org.restlet.ext.spring.SpringComponent">
        <property name="defaultTarget" ref="router" />
    </bean>

    <bean name="router" class="test.CustomSpringRouter">
        <property name="attachments">
            <map>
                <entry key="/api" value-ref="apiRouter" />
                <entry key="/statics" value-ref="staticsDirectory" />
            </map>
        </property>
        <property name="defaultAttachment" ref="staticsRedirector" />
    </bean>

    <bean id="staticsRedirector" class="test.CustomRedirector">
        <constructor-arg ref="myComponent" />
        <constructor-arg value="{o}/statics/index.html" />
        <constructor-arg value="7" />
    </bean>

    <bean name="apiRouter" class="org.restlet.ext.spring.SpringRouter">
        (...)
    </bean>

    (...)
</beans>

希望它可以帮到你, 亨利