【问题标题】:Default servlet with mapping and welcome file带有映射和欢迎文件的默认 servlet
【发布时间】:2013-12-13 09:40:03
【问题描述】:

我正在使用 Tomcat 7 来提供一些 JAXRS 服务。 我还想使用默认的 servlet 让同一个应用程序提供一些静态网页。这就是我定义映射的方式:

public void contextInitialized(ServletContextEvent sce) {
sce.getServletContext().getServletRegistrations().get("default").addMapping("/backoffice/*");
}

我的问题是访问这些静态文件的唯一方法是使用http://myserver.com/backoffice/index.html。我想通过http://myserver.com/backoffice 访问它们 我没有在 web.xml 文件中定义任何映射,只是我的主要 JAXRS 应用程序。 我试过这样使用欢迎文件列表:

 <welcome-file-list>
    <welcome-file>index.html</welcome-file>
</welcome-file-list>

我没有找到任何解决此问题的方法,并且我定义映射到默认 servlet 的方式是我发现唯一可行的方法。

感谢您的帮助。

【问题讨论】:

    标签: java tomcat servlets jax-rs


    【解决方案1】:

    我只能想到两种可能。

    1. 在 web.xml 中定义一个 servlet 映射到 html 文件或
    2. 创建一个 servlet,使用 @WebServlet 对其进行注释,然后在 doGet() 方法中调度/重定向到 html 文件。

    如果您愿意,可以动态注册 servlet。

    【讨论】:

    • 非常有用,但我最终得到了一个稍微不同的解决方案(见我的回答)
    【解决方案2】:

    我的结尾:

    在我的 ServletContextListener 中,我添加了:

    public void contextInitialized(ServletContextEvent sce) {
    String name = "backoffice-filter";
    sce.getServletContext().addFilter(name, new StaticRedirectionFilter(basePath, targetPath));
    sce.getServletContext().getFilterRegistrations().get(name).addMappingForUrlPatterns(null, false, pathDepart);
    sce.getServletContext().getServletRegistrations().get("default").addMapping("/backoffice/*");
    }
    

    StaticRedirectionFilter 类:

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
            HttpServletRequest request = (HttpServletRequest) req;
            String requestURI = request.getServletPath();
            if (requestURI.equals(basePath)) {
                HttpServletResponse response = (HttpServletResponse) res;
                response.sendRedirect(request.getContextPath() + targetPath);
            }
            else {
                chain.doFilter(req, res);
            }
    
        }
    

    正如 Alex 所提到的,我可以使用带有 StaticRedirectionFilter 类的注释 @WebFilter("/backoffice") 来完成它,但是在上下文中使用映射似乎更利于可重用性。

    我也认为它在 Servlet 3 之前有效,即使我没有尝试过。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-28
      • 2011-10-05
      • 2013-06-11
      • 1970-01-01
      • 1970-01-01
      • 2017-04-27
      • 1970-01-01
      相关资源
      最近更新 更多