Spring boot:提供公共和私有(受限)静态内容
Posted
技术标签:
【中文标题】Spring boot:提供公共和私有(受限)静态内容【英文标题】:Spring boot: Serving public and private (restricted) static content 【发布时间】:2021-10-29 07:26:36 【问题描述】:我正在使用 spring-boot-starter-web
以及 embedded-jetty
和 starter-jersey
启动器。 Jersey servlet 上下文路径在 application.properties 中配置为从/api
提供服务。所以所有的/api/.*
电话都被交给了泽西岛。
由于我使用的是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.*
时,才能到达此过滤器。我在这里错过了什么?
【问题讨论】:
为什么不使用 Spring Security? 仅仅做一个简单的过滤器可以做的事情似乎有点矫枉过正,不是吗?我在项目中没有使用spring security,所以我正在寻找解决方案而无需安装额外的库。 你最终会开发出已经用 Spring Security 解决的东西。 Cookie 处理、身份验证等 但是您假设我的 spring 应用程序将负责 cookie 管理和身份验证。事实并非如此。就像我说的那样,我正在寻找一种解决方案来避免维护额外的库。 在你的问题中我看到://检查 cookie 中的身份验证并继续 【参考方案1】:/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:提供公共和私有(受限)静态内容的主要内容,如果未能解决你的问题,请参考以下文章
具有 Spring Security 的公共和私有 REST API