Spring安全静态资源请求HTTP代码302

Spring Security static resource request HTTP code 302

在我的 Spring 引导 Web 应用程序中,我配置了 Spring 安全性以允许像这样访问静态资源

@Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                // all requests must be authenticated
                .anyRequest().authenticated()
                // allow access to static resources
                .antMatchers("/css/**", "/images/**", "/js/**", "/webjars/**").permitAll()
                .and()
            // login form authentication entry point
            .formLogin()
                .permitAll()
                .loginPage("/login")
                .usernameParameter("userId")
                .and()
            // allow unrestricted access to the logout action
            .logout()
                .logoutUrl("/logout")
                .permitAll();
    }

在我的登录 jsp 页面中,我包括 jquery 这样的

<script src="webjars/jquery/3.2.0/jquery.min.js"></script>

我在我的 pom 中这样声明 webjar

<dependency>
    <groupId>org.webjars</groupId>
    <artifactId>jquery</artifactId>
    <version>3.2.0</version>
</dependency>

但是生成的对资源@http://localhost:8080/webjars/jquery/3.2.0/jquery.min.jsreturns的GET请求状态码为302且脚本未加载。我试过在请求中包含一个前导正斜杠,但结果相同。

匹配器的顺序很重要,请参阅Spring doc

There are multiple children to the http.authorizeRequests() method each matcher is considered in the order they were declared.

所以 anyRequest() 匹配器必须在 antMatchers() 之后。这是 Spring 文档中的示例:

protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
        .antMatchers("/resources/**", "/signup", "/about").permitAll()
        .antMatchers("/admin/**").hasRole("ADMIN")
        .antMatchers("/db/**").access("hasRole('ADMIN') and hasRole('DBA')")
        .anyRequest().authenticated()
        .and()
        // ...
        .formLogin();
}

我想发生的事情是,您将被安全过滤器重定向到登录页面,从而导致 302。