经过多次尝试,我发现以下解决方案是最简单的。它基本上将绕过所有Spring处理,这是非常难处理的。
@Component
public class StaticContentFilter implements Filter {
private List<String> fileExtensions = Arrays.asList("html", "js", "json", "csv", "css", "png", "svg", "eot", "ttf", "woff", "appcache", "jpg", "jpeg", "gif", "ico");
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
doFilter((HttpServletRequest) request, (HttpServletResponse) response, chain);
}
private void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
String path = request.getServletPath();
boolean isApi = path.startsWith("/api");
boolean isResourceFile = !isApi && fileExtensions.stream().anyMatch(path::contains);
if (isApi) {
chain.doFilter(request, response);
} else if (isResourceFile) {
resourceToResponse("static" + path, response);
} else {
resourceToResponse("static/index.html", response);
}
}
private void resourceToResponse(String resourcePath, HttpServletResponse response) throws IOException {
InputStream inputStream = Thread.currentThread()
.getContextClassLoader()
.getResourceAsStream(resourcePath);
if (inputStream == null) {
response.sendError(NOT_FOUND.value(), NOT_FOUND.getReasonPhrase());
return;
}
inputStream.transferTo(response.getOutputStream());
}
}
addViewController
方法调用中遇到了问题。我的情况是我有一个未被服务的webfonts文件夹。我认为这是因为正则表达式只指定了js和css扩展名。最终我删除了第三个并添加了一个新的资源处理程序。 - Lichaderspring
前缀在代码中代表什么意思? - hguser\\w
替换为^[a-zA-Z\d-_]
,以使其适用于包含这些字符的URL。 - victor.jaspring
是一个变量名,用于分配匹配部分。但是,它仅在此处用于启用AntMatcher(https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/util/AntPathMatcher.html)中的正则表达式的使用,并且没有填充任何目的,因为它没有被使用。您可以将其更改为其他任何内容,但其目的是启用与正则表达式的匹配。要使用它,请在路径中重定向或转发到`{spring}`,然后您将使用匹配的任何内容。最后一个条目不明确,因为相同的变量分配了两个匹配... - fast-reflexes