Java web.xml - 如何为任何转发到index.html的不匹配请求执行catchall servlet?

时间:2014-10-22 04:13:45

标签: java servlets

我正在Glassfish的Java WAR中提供一个角度页面。

我需要在public下提供所有内容作为静态文件,所有其他请求应该提供index.html。

因为它是Angular,它需要提供index.html但仍然保持结束。因此,如果你去example.com/stuff,它应该加载索引页面并保留/填充。

我现在有这个glassfish-web.xml,但是我仍然会在公众面前获得404.

<!DOCTYPE glassfish-web-app PUBLIC "-//GlassFish.org//DTD 
GlassFish Application Server 3.1 Servlet 3.0//EN" 
"http://glassfish.org/dtds/glassfish-web-app_3_0-1.dtd">
<glassfish-web-app>
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>
    <servlet>
        <servlet-name>DefaultServlet</servlet-name>
        <servlet-class>
            org.apache.catalina.servlets.DefaultServlet
        </servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>DefaultServlet</servlet-name>
        <url-pattern>*</url-pattern>
    </servlet-mapping>
</glassfish-web-app>

1 个答案:

答案 0 :(得分:0)

使用Serlvet过滤器:

@WebFilter("/*")
public class MainFilter implements Filter {
    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
        throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        String requestUrl = request.getRequestURL().toString();
        if (validUrl(requestUrl)) {
            //allowed, continue navigation
            chain.doFilter(req, res);
        } else {
            //invalid URL, send back to index.html
            String invaludUrl = retrieveInvalidPart(requestUrl);
            response.sendRedirect(request.getContextPath() + "/index.html" + invaludUrl);
        }
    }

    private boolean validUrl(String url) {
        //implement how to validate the URL
    }

    private String retrieveInvalidPart(String url) {
        //implement how to recognize the invalid part of the URL
    }
}

请注意,此问题与GlassFish或任何其他应用程序服务器完全无关。

如果您还希望/需要在无效请求的情况下添加与网址相关联的query string,您可以使用HttpServletRequest#getQueryString检索它:

//invalid URL, send back to index.html
String invaludUrl = retrieveInvalidPart(requestUrl);
String queryString = request.getQueryString();
queryString = (queryString == null) ? "" : queryString;
response.sendRedirect(request.getContextPath() + "/index.html" + "?invalidUrl=" + invaludUrl + queryString);

更多信息: