Spring 启动:提供 public 和私有(受限)静态内容
Spring boot: Serving public and private (restricted) static content
我正在使用 spring-boot-starter-web
以及 embedded-jetty
和 starter-jersey
启动器。 Jersey servlet 上下文路径在 application.properties 中配置为从 /api
提供服务。所以所有 /api/.*
呼叫都被处理到 Jersey。
由于我使用的是 starter-web
,静态内容是从 static/
目录提供的,如下所示:
static/public/
下列出的所有资源都可以不受任何限制地访问。但是static/private
下的资源应该是受限制的,只有登录后才会显示。
为此,我编写了一个过滤器:
@Component
@Order(1)
public static class PrivateContentFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
if (request.getRequestURI().matches(".*/static/private/.*")) {
// Check for authentication in the cookie and procceed
// The cookie is handed to an auth mirco-service, that does the actual validation.
}
}
}
但只有当路径为 api/.*
时才会达到此过滤器,而不是针对静态内容:/public/.*
或 /private.*
。我在这里错过了什么?
/static 下的所有内容都是上下文 / 因此您的过滤器正则表达式必须如下所示:
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
if (request.getRequestURI().matches("/private/.*")) {
System.out.println("private");
} else {
System.out.println("public");
}
filterChain.doFilter(servletRequest, servletResponse);
}
我正在使用 spring-boot-starter-web
以及 embedded-jetty
和 starter-jersey
启动器。 Jersey servlet 上下文路径在 application.properties 中配置为从 /api
提供服务。所以所有 /api/.*
呼叫都被处理到 Jersey。
由于我使用的是 starter-web
,静态内容是从 static/
目录提供的,如下所示:
static/public/
下列出的所有资源都可以不受任何限制地访问。但是static/private
下的资源应该是受限制的,只有登录后才会显示。
为此,我编写了一个过滤器:
@Component
@Order(1)
public static class PrivateContentFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
if (request.getRequestURI().matches(".*/static/private/.*")) {
// Check for authentication in the cookie and procceed
// The cookie is handed to an auth mirco-service, that does the actual validation.
}
}
}
但只有当路径为 api/.*
时才会达到此过滤器,而不是针对静态内容:/public/.*
或 /private.*
。我在这里错过了什么?
/static 下的所有内容都是上下文 / 因此您的过滤器正则表达式必须如下所示:
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
if (request.getRequestURI().matches("/private/.*")) {
System.out.println("private");
} else {
System.out.println("public");
}
filterChain.doFilter(servletRequest, servletResponse);
}