Java web.xml - 如何为任何不匹配的请求执行一个包罗万象的 servlet 以转发到 index.html?

Posted

技术标签:

【中文标题】Java web.xml - 如何为任何不匹配的请求执行一个包罗万象的 servlet 以转发到 index.html?【英文标题】:Java web.xml - How do I do a catchall servlet for any unmatched requests to forward to index.html? 【发布时间】:2014-12-17 11:25:45 【问题描述】:

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

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

因为它是 Angular,它需要服务 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>

【问题讨论】:

删除了 GlassFish,因为问题和解决方案与应用服务器无关。 warangularjs 标签类似。 【参考方案1】:

使用 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添加到url,您可以使用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);

更多信息:

*** Servlet Filter Wiki How can I get the request URL from a Java Filter?

【讨论】:

以上是关于Java web.xml - 如何为任何不匹配的请求执行一个包罗万象的 servlet 以转发到 index.html?的主要内容,如果未能解决你的问题,请参考以下文章

如何为带有 InMemoryCache 的 apollo-client 中的正则表达式匹配的任何数据指定最大缓存时间?

如何为特定用户实施旧密码和新密码?

如何为 Java 库编写黄瓜验收

如何为'where'子句中的项目返回一些默认值,这些项目在数据库表列中不匹配(不存在)

如何为提及和主题标签修复此正则表达式?

Java 并发是如何为 Windows 实现的? [关闭]