【问题标题】:ServletModule.filter versus @WebFilterServletModule.filter 与 @WebFilter
【发布时间】:2019-11-12 16:32:26
【问题描述】:

我正在尝试遵循有关将 Guice 用于 Web 服务器的最小教程,而不需要 web.xml:http://www.remmelt.com/post/minimal-guice-servlet-without-web-xml/

与本教程的创建者一样,我无法使 ServletModule 过滤器命令按预期工作,但所有相同的代码,而不是在 Filter 类上使用 @WebFilter 属性会导致 Web 服务器正常工作。

如何使 ServletModule 过滤器工作?导致这种期望差异的 ServletModule 的过滤方法和 @WebFilter 属性有什么区别?

除了教程中的内容之外,我还尝试在“过滤器”命令之前绑定过滤器。

@WebListener
public class GuiceServletConfig extends GuiceServletContextListener {
    @Override
    protected Injector getInjector() {
        return Guice.createInjector(new ServletModule() {
            @Override
            protected void configureServlets() {
                super.configureServlets();
                serve("/*").with(WiredServlet.class);
                filter("/*").through(GuiceWebFilter.class);
                bind(MessageSender.class).to(MessageSenderImpl.class);
            }
        });
    }
}

public class GuiceWebFilter extends GuiceFilter{
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        super.doFilter(servletRequest, servletResponse, filterChain);
    }
}

@Singleton
public class WiredServlet extends HttpServlet {
    @Inject
    private MessageSender messageSender;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getOutputStream().print("Hello world!");
    }
}

使用@WebFilter("/*"),我得到“Hello World!”的简单响应。

使用过滤器(“/*”),我在同一个请求中得到了 404。

【问题讨论】:

    标签: java guice servlet-filters


    【解决方案1】:

    据我所知,我正在寻找的东西是不可能的。为了声明一个没有 @WebFilter 属性的过滤器,您必须有一个这样的 web.xml:

    <!DOCTYPE web-app PUBLIC
            "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
            "http://java.sun.com/dtd/web-app_2_3.dtd" >
    
    <web-app id="WebApp_ID" version="2.4"
             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">
    
        <display-name>Application</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>
    </web-app>
    

    总而言之,你可以使用@WebFilter 属性,或者你必须有一个web.xml,没有办法避免两者都更容易阅读配置。

    【讨论】:

      猜你喜欢
      • 2013-10-04
      • 2013-08-18
      • 2016-11-22
      • 2018-08-05
      • 2012-10-12
      • 2015-12-10
      • 1970-01-01
      • 2014-12-06
      • 2013-04-18
      相关资源
      最近更新 更多