springboot拦截静态资源

772 阅读2分钟

当我们使用 Spring Boot 搭建 Web 应用程序时,通常需要提供静态资源(如图像、CSS 和 JavaScript 文件)以供客户端访问。但是,有时我们希望限制对某些静态资源的访问,例如阻止用户访问敏感的配置文件或其他重要的文件。

本文将介绍如何使用 Spring Boot 来限制对静态资源的访问。

方法一:使用 WebSecurityConfigurerAdapter 类

使用 WebSecurityConfigurerAdapter 类是一种常见的方法,可以在 Spring Boot 应用程序中限制对静态资源的访问。该类提供了一种简单的方法来配置 Spring Security,以便限制对静态资源的访问。

以下是一个示例:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .antMatchers("/static/**").denyAll()
            .anyRequest().authenticated()
            .and()
            .formLogin()
            .and()
            .httpBasic();
    }
}

在上面的示例中,.antMatchers("/static/**").denyAll() 表示拒绝对 /static 目录下所有资源的访问。

您可以通过以下方式指定允许访问的资源:

.antMatchers("/static/css/**", "/static/js/**").permitAll()

这将允许对 /static/css 和 /static/js 目录下的所有资源进行访问。

请注意,如果您使用了 Spring Security,Spring Boot 将自动应用默认的安全配置。如果您希望完全自定义安全配置,请参考上面的示例并相应地修改您的配置。

方法二:使用 ResourceHttpRequestHandler 类

另一种限制对静态资源的访问的方法是使用 ResourceHttpRequestHandler 类,该类是 Spring MVC 内置的处理静态资源请求的处理器之一。您可以自定义一个 ResourceHttpRequestHandler 实例,并通过 addResourceLocations 方法指定静态资源的位置,然后使用 addInterceptor 方法添加拦截器来控制对静态资源的访问。

以下是一个示例:

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static/**")
                .addResourceLocations("classpath:/static/");
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new HandlerInterceptor() {
            @Override
            public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
                if (request.getRequestURI().startsWith("/static/")) {
                    response.setStatus(HttpStatus.FORBIDDEN.value());
                    return false;
                }
                return true;
            }
        });
    }
}

在上面的示例中,addResourceHandlers 方法将静态资源的位置设置为 classpath:/static/,而 addInterceptors 方法添加了一个拦截器,它检查请求是否针对静态资源,并如果是,则返回 HTTP 403 状态码。

方法三:使用 Web 服务器

最后一种限制对静态资源的访问的方法是使用 Web 服务器(如 Nginx 或 Apache)来限制访问静态资源。您可以配置 Web 服务器来拒绝对指定静态资源的请求,而不是让 Spring Boot 应用程序处理这些请求。这种做法的好处是可以减轻应用程序的负担,并提高性能和安全性。

例如,以下是一个 Nginx 配置文件示例,它将拒绝对 /static/config.properties 文件的访问:

location /static/config.properties {
    deny all;
}

通过使用上述三种方法之一,您可以限制对静态资源的访问,从而提高应用程序的安全性。