如果我们在WAR自己定义特定于webapp的servlet过滤器web.xml,那么过滤器的执行顺序将与它们在中定义的顺序相同web.xml.
但是,如果我们使用@WebFilter注释定义这些过滤器,过滤器的执行顺序是什么,我们如何确定执行顺序?
<servlet-mapping>
<servlet-name> s1</servlet-name>
<url-pattern> /abc </url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name> s2</servlet-name>
<url-pattern> /abc </url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name> s3</servlet-name>
<url-pattern> /* </url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)
如果请求/ abc到来,将调用哪个servlet?为什么?
我在tomcat中使用Guice-servlets和websocket创建了一个示例webapp,现在一次使用guice过滤器websocket停止工作
在我的web.xml中,我使用了初始化Guiceservlet GuiceBasedListener
<web-app>
<listener>
<listener-class>test.GuiceBasedListener</listener-class>
</listener>
<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>
</web-app>
Run Code Online (Sandbox Code Playgroud)
GuieBasedListener将所有请求绑定/*到的代码MyDispatcher
public class GuiceBasedListener extends GuiceServletContextListener {
protected Injector getInjector() {
return Guice.createInjector( new ServletModule() {
@Override
protected void configureServlets() {
bind(MyDispatcher.class).asEagerSingleton();
serve("/*").with(MyDispatcher.class);//////IMPORTANT LINE//
}
});}}
Run Code Online (Sandbox Code Playgroud)
MyDispatcher 只用String响应的代码
public class MyDispatcher extends HttpServlet {
@Inject private Injector injector;
public MyDispatcher() {}
public void service(ServletRequest req, ServletResponse resp) throws IOException, ServletException {
resp.getOutputStream().print("SUCCESS:" + req);
}
}
Run Code Online (Sandbox Code Playgroud)
我还有一个@ServerEndPoint for Websocket …