tl; dr:当它(servlet)与通配符(/a/*
)绑定时,从servlet调度到绝对路径失败,但是在绑定时没有明确绑定({{1 }})
我有一个带有servlet的Guice webapp,它将流量分派给存储在WEB-INF中的HTML文件:
/b/b
配置了@Singleton
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getRequestDispatcher("/WEB-INF/hello.html").forward(request, response);
}
}
...
GuiceServletContextListener
...和public class MyApp extends GuiceServletContextListener {
@Override
protected Injector getInjector() {
return Guice.createInjector(new MyModule());
}
private static final class MyModule extends ServletModule {
@Override
protected void configureServlets() {
serve("/a/*").with(MyServlet.class);
serve("/b/b").with(MyServlet.class);
}
}
}
:
web.xml
我在Tomcat中启动它,然后转到<?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_4.xsd"
version="2.4">
<display-name>MyApp</display-name>
<filter>
<filter-name>guiceFilter</filter-name>
<filter-class>com.google.inject.servlet.GuiceFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>guiceFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>test.MyApp</listener-class>
</listener>
</web-app>
,我看到了localhost/b/b
页面。但是,当我转到hello.html
时,我会收到localhost/a/a
。这对我来说似乎很奇怪,因为两个路径(通配或不通配)绑定到同一个servlet,以及HTML路径是绝对的,而不是真正用于解释。
这是一个错误的结果,一些(对我未知)的行为我没有考虑到,或者我的错误配置?
修改
根据一些进一步的实验,HTTP Status 404 - /WEB-INF/hello.html
似乎按预期工作,这表明include
有一些我错过的额外行为。使用forward
可能会暂时阻止我,但我仍然想知道我做错了什么。
答案 0 :(得分:1)
我发现GitHub issue似乎与我遇到的问题相符,这意味着它是Guice本身的一个错误。
这个漏洞最初是在2010年报道的,并且已经被贡献者看作是次要的兴趣,而且没有任何来自负责人,所以它可能永远不会被修复。
为了将来参考,我现在要尝试使用include
,并考虑在将来某个时候切换到另一个框架。