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

Java web.xml-如何为转发到index.html的任何不匹配请求创建catchall servlet?,java,servlets,Java,Servlets,我在Glassfish的爪哇战争中为一个有棱角的页面服务 我需要将public下的所有内容作为静态文件提供,所有其他请求都应该提供index.html 因为它是有角度的,所以它需要提供index.html,但仍然保持结尾。因此,如果您访问example.com/stuff,它应该加载索引页,并在末尾保留/stuff 我现在有一个glassfish-web.xml,但我仍然得到了一个404,用于公共场所以外的所有东西 <!DOCTYPE glassfish-web-app PUBLIC "-

我在Glassfish的爪哇战争中为一个有棱角的页面服务

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

因为它是有角度的,所以它需要提供index.html,但仍然保持结尾。因此,如果您访问example.com/stuff,它应该加载索引页,并在末尾保留/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>
使用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或任何其他应用程序服务器完全无关

如果您还希望/需要在请求无效的情况下添加与url关联的,可以使用HttpServletRequestgetQueryString检索它:

更多信息:


已删除GlassFish,因为问题和解决方案与应用程序服务器无关。war和angularjs标记类似。
//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);