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,因为问题和解决方案与应用服务器无关。 war 和 angularjs 标签类似。 【参考方案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 中的正则表达式匹配的任何数据指定最大缓存时间?